PHP中使用Curl在请求头添加JSON字符串的问题排查
你遇到的问题我太熟悉了——把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

