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

Node.js使用request发POST请求返回400状态码且无法提交数据怎么解决

问题原因

  1. 你的Node.js请求配置中设置了json: true,会自动将提交数据序列化为JSON字符串,同时请求头Content-Type会被设置为application/json。
  2. PHP原生的$_POST超全局变量仅会解析Content-Type为application/x-www-form-urlencoded或multipart/form-data的请求,无法识别JSON格式的请求体,部分PHP框架遇到未适配的请求格式会直接返回400状态码。
  3. 浏览器直接访问接口是GET请求,不会触发POST相关的格式校验,因此可以正常返回空数组。

解决方案

你可以任选以下一种方案适配:

方案1:修改Node.js请求逻辑,发送表单格式数据(适配原生$_POST)

直接将配置中的json: true和body参数替换为form参数,request库会自动将数据转换为x-www-form-urlencoded格式,PHP可以直接通过$_POST读取参数:

const request = require('request');
const notification_options = {
    url: 'https://my-site.com/site/push',
    form: {
       var1: "test1",
       var2: "test2"
    }
};

request.post(notification_options, (err, res, body) => {
    if (err) {
        return console.log(err);
    }
    console.log(`Status: ${res.statusCode}`);
    console.log(body);
});

方案2:修改PHP代码,支持解析JSON格式请求

如果业务需要保留JSON格式的提交逻辑,可在PHP侧手动读取原始请求体解析:

public function actionPush(){
    $postData = [];
    if (stripos($_SERVER['CONTENT_TYPE'], 'application/json') !== false) {
        // 读取JSON格式的原始请求体
        $rawInput = file_get_contents('php://input');
        $postData = json_decode($rawInput, true);
    } else {
        $postData = $_POST;
    }
    var_dump($postData);
}

补充排查点

如果调整请求格式后仍然返回400,需检查你使用的PHP框架是否开启了全局POST请求CSRF校验,这类校验会拦截未携带合法CSRF令牌的请求,将当前接口加入框架的CSRF校验白名单即可解决。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 14:24:02