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

React+Axios传参至PHP后端时warehouses字段丢失问题排查

问题原因分析
  • Axios在序列化URL参数(params)时,默认会忽略空数组、空对象、null这类无实际值的字段,所以warehouses: []不会被拼接到请求URL的参数中,导致PHP端$_REQUEST无法捕获到该字段。
  • 你提到的“发送的是JSON对象”存在误解:通过params传递的是URL查询参数,并非请求体中的JSON数据,Axios会将params对象转换为?request=login&formdata[account_id]=xxx这类格式,空数组会被直接跳过。
验证方法

打开浏览器DevTools的Network面板,定位该POST请求,查看Query String Parameters:

  • 如果没有formdata[filters][warehouses]字段,说明是Axios序列化规则导致的前端问题;
  • 如果存在该字段,再排查PHP端配置(比如max_input_vars限制、自动过滤空值的逻辑)。
解决方案

方案1:修改Axios参数序列化规则,强制保留空数组

Axios依赖qs库处理参数序列化,可自定义规则强制保留空数组:

import qs from 'qs';

axios.post(ProjectConfig.api_url, null, {
  headers: {
    'LTKN': cookies.get('ltkn'),
  },
  params: {
    request: 'login',
    formdata: formValues
  },
  paramsSerializer: (params) => {
    // arrayFormat: 'indices' 会将空数组序列化为warehouses[]=,确保参数存在
    return qs.stringify(params, { arrayFormat: 'indices', skipNulls: false });
  }
})

方案2:将formdata放在请求体中(推荐)

POST请求更适合将复杂数据放在请求体而非URL参数中,能从根源避免空值被忽略的问题:

前端代码修改

axios.post(ProjectConfig.api_url, {
  request: 'login',
  formdata: formValues
}, {
  headers: {
    'LTKN': cookies.get('ltkn'),
    'Content-Type': 'application/json'
  }
})

后端PHP代码修改

case 'login':
// 从请求体读取JSON数据
$rawBody = file_get_contents('php://input');
$requestData = json_decode($rawBody, true);
$formdata = $requestData['formdata'];
$manual_token = $requestData['manual_token'] ?? null;

方案3:后端手动补全缺失字段(临时 workaround)

若暂时无法修改前端,可在PHP端检查字段是否存在,缺失则补全:

case 'login':
$formdata = $_REQUEST['formdata'];
// 补全warehouses字段
if (!isset($formdata['filters']['warehouses'])) {
    $formdata['filters']['warehouses'] = [];
}
$manual_token = $_REQUEST['manual_token'];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:22:44