使用fetch发送POST请求时PHP端$_POST为空数组的问题求助
问题原因
PHP 内置的 $_POST 全局变量仅会自动解析 MIME 类型为 application/x-www-form-urlencoded 或 multipart/form-data 的请求体。你的前端代码指定了 Content-Type: application/json,且请求体是序列化后的 JSON 字符串,PHP 不会将这类数据自动解析到 $_POST 中,因此读取结果为空数组。
解决方法
你可以根据业务场景选择以下任意一种方案:
方案1:后端适配JSON请求(推荐,前后端数据交互更规范)
无需修改前端代码,PHP 侧直接从输入流读取原始请求体,再反序列化为数组/对象即可:// 原生PHP写法 $rawInput = file_get_contents('php://input'); $requestData = json_decode($rawInput, true); // 第二个参数为true时返回数组,否则返回对象 // 你传递的data参数可通过 $requestData['data'] 读取如果你使用的是 Laravel、ThinkPHP 等现代框架,框架本身已经做了JSON请求的适配,直接用框架提供的请求方法即可读取参数,比如Laravel中可以直接调用
$request->input('data')拿到对应值。方案2:前端调整发送格式,适配
$_POST解析规则
无需修改后端原有读取$_POST的逻辑,将前端请求体改为multipart/form-data格式即可:async function updatesProf(data) { const formData = new FormData(); // 如果data是复杂对象,可先转成JSON字符串,后端接收后再json_decode formData.append('data', typeof data === 'object' ? JSON.stringify(data) : data); const dataUpdate = { method:"POST", headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') // 不要手动设置Content-Type,浏览器会自动为FormData添加带boundary的正确值 }, body: formData }; await fetch('synthese', dataUpdate) .then(response => response.json()).then(res => data ) .catch(error => console.log("Error: "+error)); }修改后PHP侧可直接通过
$_POST['data']读取传递的参数。
内容的提问来源于stack exchange,提问作者kev007
相关产品推荐
相关产品推荐

