Node.js使用request发POST请求返回400状态码且无法提交数据怎么解决
问题原因
- 你的Node.js请求配置中设置了
json: true,会自动将提交数据序列化为JSON字符串,同时请求头Content-Type会被设置为application/json。 - PHP原生的
$_POST超全局变量仅会解析Content-Type为application/x-www-form-urlencoded或multipart/form-data的请求,无法识别JSON格式的请求体,部分PHP框架遇到未适配的请求格式会直接返回400状态码。 - 浏览器直接访问接口是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
相关产品推荐
相关产品推荐

