PHP中使用CURL调用API返回No data sent错误如何解决
问题排查&修复方案
1. 先补充错误检测逻辑,定位具体故障点
你当前代码缺少请求错误、JSON编码错误的校验,无法区分是请求发送失败还是API侧参数解析失败,先替换为带错误检测的代码:
<?php $url = 'endpoint'; $curl = curl_init(); $valu = array( 'username' => 'used', 'firstname' => 'user', 'email' => 'user@email.com', 'bio' => 'A very good personality', 'lastname' => 'demo', 'password' => 'date' ); // 校验JSON编码是否出错 $postData = array("data" => $valu); $json_string = json_encode($postData); if (json_last_error() !== JSON_ERROR_NONE) { die("JSON编码失败:" . json_last_error_msg()); } curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, TRUE); curl_setopt($curl, CURLOPT_POSTFIELDS, $json_string); curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json')); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true ); // 本地测试HTTPS接口可临时加下面两行跳过证书校验,生产环境请删除 // curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); $data = curl_exec($curl); // 校验CURL请求本身是否出错 if(curl_errno($curl)){ die("CURL请求错误:" . curl_error($curl)); } // 打印响应状态码,判断是否为4xx/5xx类错误 $responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); echo "响应状态码:" . $responseCode . "<br>"; if($data){ echo "响应内容:" . $data; } curl_close($curl); ?>
2. 核对API参数结构要求
你提到API要求字段放在data节点中,但给出的API示例结构没有外层data包裹,对应两种修复方式:
- 如果API要求请求体直接是字段对象(不需要外层
data包裹),调整JSON构造逻辑即可:// 去掉外层的data包裹 $json_string = json_encode($valu); - 如果API要求表单格式提交,参数名为
data、值为字段对象,删掉JSON格式的头配置,直接传表单数组:curl_setopt($curl, CURLOPT_POSTFIELDS, [ 'data' => json_encode($valu) ]); // 删掉原来的Content-Type:application/json配置,CURL会自动适配表单格式头
3. 其他常见踩坑点
- 确认
$url是真实接口地址,不是占位的endpoint - 确认接口是否需要额外请求头,比如鉴权token、
Accept: application/json等
内容的提问来源于stack exchange,提问作者Samuel Titiloye-jnr
相关产品推荐
相关产品推荐

