PHP CURL调用API报错Request payload is not JSON 求助
问题排查与解决
你的代码里HTTP请求头的格式写错了,这是导致API识别不到JSON payload的核心原因。
curl的CURLOPT_HTTPHEADER选项要求传入的是字符串数组,每个元素是完整的头字段(格式为"键: 值"),而不是关联数组。你当前用的array("Content-Type" => "application/json")会被curl错误解析,导致实际发送的请求头不符合规范,API因此无法识别请求体是JSON格式。
修正后的代码:
$fields = array( 'aaaaa' => 'aaaaa', 'bbbbb' => 'bbbbb', 'ccccc' => 'ccccc', 'ddddd' => 'ddddd' ); $fields_json = json_encode($fields); // 先确认JSON编码是否成功,避免空字符串或false导致的问题 if ($fields_json === false) { die(json_last_error_msg()); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $this->api_url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_json); // 修正HTTP头格式:使用字符串数组 curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Content-Type: application/json" )); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = json_decode(curl_exec($ch), true); // 额外排查:如果请求仍有问题,检查curl错误 if(curl_errno($ch)){ echo 'CURL错误:' . curl_error($ch); } curl_close($ch);
额外注意点:
- 始终检查
json_encode的返回值,如果编码失败(比如包含无法序列化的内容),会返回false,这也会导致API报错。 - 调试时可以开启curl的错误输出,或者用抓包工具对比ThunderClient和PHP curl发送的请求头、请求体,确认差异。
内容的提问来源于stack exchange,提问作者Jacopo Gazzola
相关产品推荐
相关产品推荐

