Node.js中Axios发送POST请求未携带请求体的问题
Axios发送POST请求PHP无法获取$_POST数据的原因及解决办法
你遇到的问题核心在于Axios和jQuery发送请求的Content-Type格式不一致,导致PHP解析请求体的方式不同:
- Axios默认会将请求体序列化为JSON格式,请求头
Content-Type设为application/json,但PHP的$_POST数组只会自动解析application/x-www-form-urlencoded或multipart/form-data格式的数据,所以直接用$_POST['subject']会返回null。 - jQuery的
$.ajax默认会把data对象转换为application/x-www-form-urlencoded格式的键值对(比如emailto=xxx&toname=xxx),这种格式会被PHP自动解析到$_POST中,因此能正常获取数据。
下面提供两种解决办法:
方法一:让Axios发送urlencoded格式数据(与jQuery一致)
方式1:使用URLSearchParams构造请求体
修改Axios代码,直接用URLSearchParams拼接参数,Axios会自动设置正确的请求头:
const axios = require("axios").default; const params = new URLSearchParams(); params.append('emailto', 'receiver email'); params.append('toname', 'name'); params.append('emailfrom', 'sender email'); params.append('fromname', 'name'); params.append('subject', 'subject'); params.append('messagebody', 'hello world'); axios.post("my url goes here/email.php", params);
方式2:用qs库序列化复杂对象
如果请求体包含嵌套对象等复杂结构,推荐使用qs库序列化:
- 先安装依赖:
npm install qs - 修改代码:
const axios = require("axios").default; const qs = require('qs'); axios.post("my url goes here/email.php", qs.stringify({ emailto: "receiver email", toname: "name", emailfrom: "sender email", fromname: "name", subject: "subject", messagebody: "hello world" }));
方法二:PHP端直接解析JSON请求体
如果不想修改Axios的请求格式,PHP可以读取原始请求体并解析为数组:
$rawBody = file_get_contents('php://input'); $data = json_decode($rawBody, true); $subject = $data['subject']; // 正常获取数据
注:json_decode的第二个参数设为true,会将JSON对象转换为PHP关联数组,使用方式和$_POST一致。
内容的提问来源于stack exchange,提问作者Krokodil
相关产品推荐
相关产品推荐

