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

PHP API调用另一个PHP API时请求体丢失问题排查

问题排查:PHP API间调用时请求体数据丢失的问题

我帮你梳理了代码里的问题,核心是第二个API的curl调用环节出了两个关键错误,导致第一个API接收不到有效数据:


错误1:未定义的变量 $userData

你在第二个API中使用了CURLOPT_POSTFIELDS, $userData,但这个$userData变量从未初始化过,相当于给第一个API传递了空值,直接导致对方拿不到任何请求体内容。

错误2:数据格式不匹配

就算你把$userData换成$data(也就是你用json_decode解析后的结果),依然会有问题——当curl接收数组/对象作为POSTFIELDS参数时,会自动把数据编码成application/x-www-form-urlencoded(表单提交格式),但第一个API是通过php://input读取JSON格式的请求体,自然无法解析,最终返回NULL。


修正后的第二个API代码

这里给你两种可行的修正方案:

方案1:直接传递原始JSON请求体

如果不需要修改转发的数据,直接把第二个API收到的原始JSON内容传给第一个API即可:

// 发起调用的第二个API代码
// required headers
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

// 获取原始的POST JSON内容,无需解析
$rawJson = file_get_contents("php://input");

$url = "http://mylocalsite.com/user/create";
$client = curl_init($url);
curl_setopt($client, CURLOPT_RETURNTRANSFER, true);
curl_setopt($client, CURLOPT_POST, true);
// 直接传递原始JSON字符串
curl_setopt($client, CURLOPT_POSTFIELDS, $rawJson);
curl_setopt($client, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
$response = curl_exec($client);
curl_close($client);

// 输出第一个API的响应结果
echo $response;

方案2:修改数据后重新编码为JSON

如果需要先修改收到的数据再转发,记得把修改后的内容重新编码成JSON字符串:

// 发起调用的第二个API代码
// required headers
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

// 解析收到的JSON为数组(方便修改)
$data = json_decode(file_get_contents("php://input"), true);

// 这里可以对$data做自定义修改,比如添加字段
// $data['status'] = 'pending';

// 重新编码为JSON字符串
$jsonData = json_encode($data);

$url = "http://mylocalsite.com/user/create";
$client = curl_init($url);
curl_setopt($client, CURLOPT_RETURNTRANSFER, true);
curl_setopt($client, CURLOPT_POST, true);
curl_setopt($client, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($client, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
$response = curl_exec($client);
curl_close($client);

echo $response;

调试小技巧

如果还是有问题,可以在第一个API里先打印原始请求体内容,确认是否收到了正确的JSON:

// 第一个API中添加此行
echo file_get_contents("php://input");

这样能快速判断是第二个API没传对数据,还是第一个API解析环节出了问题。

内容的提问来源于stack exchange,提问作者Mino Lazzi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:36:45