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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:15:03