You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Fetch发送带参请求时PHP的$_POST为空问题排查

嘿,我知道这个问题的症结所在!你遇到的情况是因为PHP的$_POST超全局变量默认只会解析表单编码格式的请求数据,也就是application/x-www-form-urlencoded或者multipart/form-data类型的请求体,而你用Fetch发送的是application/json格式的数据,所以PHP不会自动把它填充到$_POST里,自然返回空数组啦。

下面给你两种解决办法,看你需求选就行:

方法一:PHP端读取原始JSON输入流

直接在PHP里读取请求的原始内容,然后解析成JSON数组。修改你的PHP代码如下:

// 读取原始请求体内容
$rawInput = file_get_contents('php://input');
// 解析JSON为关联数组(第二个参数true确保转成数组而非对象)
$requestData = json_decode($rawInput, true);
// 返回解析后的数据
echo json_encode($requestData);

这样你的JS代码不用做任何修改,就能正常拿到请求的数据了。

方法二:修改Fetch请求为表单编码格式

如果你更希望用$_POST直接获取数据,可以把Fetch的请求头和请求体改成表单编码的形式:

function json(response){ return response.json() }
let data = {obj : 'value'};
fetch('http://localhost/Fetch_mysql_angular/requests.php', {
 method: 'post',
 headers: {
 'Accept': 'application/json',
 "Content-type": "application/x-www-form-urlencoded" // 改为表单编码类型
 },
 body: new URLSearchParams(data) // 将数据转换为URL编码格式
})
.then(json)
.then(function (data) {
 console.log(data);
})
.catch(function (error) {
 console.log('Request failed', error);
});

这时候你原来的PHP代码<?php echo json_encode($_POST); ?>就可以正常返回数据了。

简单总结下:application/json格式的请求体不会被PHP自动解析到$_POST,必须手动读取php://input;如果想用$_POST直接获取,就得采用表单编码的请求格式。

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

火山引擎 最新活动