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
相关产品推荐
相关产品推荐

