PHP使用CURL向远程API发POST请求时缺失必填字段问题排查
API POST请求返回400 "Missing required fields" 问题排查与修复
你尝试向指定API发送POST请求,API要求必填字段id(INTEGER)、date(DATE)、hours(FLOAT),请求示例如下:
POST /api/v1/chase HTTP/1.1 Host: chamos.postos Authorization: bearer 123123123 Accept: application/json Content-Type: application/json; charset=utf-8 Content-Length: 63 { "id": 1, "date": "2023-12-12", "hours": "4.3" }
但使用PHP代码发送请求时,收到400错误,提示缺失所有必填字段。你的代码如下:
function call($url, $method = 'GET', $data= null) { $api = 'https://chamos.postos.com/api/v1/'; $token = '123123123'; $api_url = $api . $url; $curl = curl_init($api_url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, [ 'Authorization: bearer ' . $token, 'Accept: application/json', ]); if ($method === 'POST') { curl_setopt($curl, CURLOPT_POST, true); if ($requestData) { curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); } } $res= curl_exec($curl); curl_close($curl); if (!$res) { return false; } return json_decode($res, true); } // some data that is passed down from js: function post($formData) { $data= [ 'id' => $id, 'date' => $date, 'hours' => $hours ]; return call('/chase', 'POST', $data); }
错误点分析
post函数未正确提取传入数据:你定义的$data数组使用了$id、$date、$hours变量,但这些变量没有从传入的$formData中取值,导致数组字段为空,API判定必填字段缺失。- POST请求的判断变量错误:
call函数里判断if ($requestData),但函数参数是$data,这个条件永远不成立,因此不会设置请求体内容,等于没发送任何字段数据。 - 缺少JSON格式请求头:API要求接收JSON数据,但你的请求头未添加
Content-Type: application/json; charset=utf-8,导致API无法正确解析请求体。
修正后的代码
function call($url, $method = 'GET', $data= null) { $api = 'https://chamos.postos.com/api/v1/'; $token = '123123123'; $api_url = $api . $url; $curl = curl_init($api_url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 添加JSON格式请求头 $headers = [ 'Authorization: bearer ' . $token, 'Accept: application/json', 'Content-Type: application/json; charset=utf-8' ]; curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); if ($method === 'POST') { curl_setopt($curl, CURLOPT_POST, true); // 修正判断变量为$data,确保有数据时发送请求体 if ($data !== null) { curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); } } $res= curl_exec($curl); curl_close($curl); if (!$res) { return false; } return json_decode($res, true); } function post($formData) { // 从传入的$formData中提取字段值,需和前端传输的键名对应 $data= [ 'id' => $formData['id'], 'date' => $formData['date'], 'hours' => $formData['hours'] ]; return call('/chase', 'POST', $data); }
额外注意事项
- 确认
$formData中确实包含id、date、hours三个键,且值类型符合API要求:id为整数,date为YYYY-MM-DD格式字符串,hours为浮点数(字符串或数字类型均可,API通常能自动识别)。 - 可以在
post函数中添加var_dump($data)输出数组内容,确认数据正确后再发送请求。
内容的提问来源于stack exchange,提问作者CJR
相关产品推荐
相关产品推荐

