You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中使用Curl在请求头添加JSON字符串的问题排查

解决请求头携带JSON未被API识别的问题

你遇到的问题我太熟悉了——把JSON塞进自定义请求头后,API却死活读不到字段对吧?我帮你拆解几个最可能的原因和修复方案:

1. 请求头格式踩坑:冒号后多余的空格

你的代码里请求头的冒号后面加了空格(比如Authorization : ApiKey XXX),虽然不少服务器能兼容这种写法,但部分对格式严格的服务器会把这个空格当成头值的一部分,直接导致解析异常。先把这些多余的空格去掉:

// 修正前
array( 'Authorization : ApiKey XXX', 'X-Kloudless-Metadata :'.$json, )

// 修正后
array( 'Authorization: ApiKey XXX', 'X-Kloudless-Metadata: ' . $json, )

划重点:冒号和头名之间绝对不能有空格,但冒号和头值之间留一个空格是标准写法,没问题。

2. 先确认JSON编码是否真的正确

有时候PHP的json_encode会因为数组格式、特殊字符等问题生成无效JSON,API自然读不到字段。你可以先加个校验步骤:

$metadata = [
    "parent_id" => "FgzDPEyJRhb-xZLC9yVhGOyaVQypI2TDSO6NQsnS",
    "name" => "dummy-1.txt"
];
$json = json_encode($metadata);

// 检查JSON编码是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
    die('JSON编码失败: ' . json_last_error_msg());
}

// 打印看看生成的JSON是否符合预期
var_dump($json);

正常输出应该是:string(88) "{"parent_id":"FgzDPEyJRhb-xZLC9yVhGOyaVQypI2TDSO6NQsnS","name":"dummy-1.txt"}",如果有语法错误(比如多余逗号、未转义的引号),直接修正就行。

3. 开启CURL Verbose模式,看实际发送的请求头

如果上面两步都没问题,那得确认CURL到底把什么内容发出去了。开启Verbose模式能看到原始请求日志:

$ch = curl_init('你的API地址');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true); 
$verboseLogFile = fopen('php://temp', 'w+');
curl_setopt($ch, CURLOPT_STDERR, $verboseLogFile); 

// 设置修正后的请求头
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: ApiKey XXX',
    'X-Kloudless-Metadata: ' . $json,
));

$response = curl_exec($ch);

// 读取并打印日志
rewind($verboseLogFile);
$logContent = stream_get_contents($verboseLogFile);
echo "请求日志:\n$logContent\n";

curl_close($ch);
fclose($verboseLogFile);

在日志里找请求头部分,你应该能看到类似这样的内容:

X-Kloudless-Metadata: {"parent_id":"FgzDPEyJRhb-xZLC9yVhGOyaVQypI2TDSO6NQsnS","name":"dummy-1.txt"}

如果这里的JSON和你生成的不一致,说明发送过程中出了问题;如果完全一致,那可能得再核对API文档——会不会是你误解了要求,这些字段其实该放在请求体里?

完整修正后的代码示例

$metadata = [
    "parent_id" => "FgzDPEyJRhb-xZLC9yVhGOyaVQypI2TDSO6NQsnS",
    "name" => "dummy-1.txt"
];
$json = json_encode($metadata);

if (json_last_error() !== JSON_ERROR_NONE) {
    die('JSON编码错误: ' . json_last_error_msg());
}

$ch = curl_init('替换为你的API端点');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: ApiKey XXX',
    'X-Kloudless-Metadata: ' . $json,
));

$response = curl_exec($ch);

if (curl_errno($ch)) {
    die('CURL请求错误: ' . curl_error($ch));
}

$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo "HTTP状态码: $httpCode\n";
echo "API响应: $response\n";

内容的提问来源于stack exchange,提问作者Naveen Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 20:14:12