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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:44:52