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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:52:16