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

PHP无法获取POST请求体问题:Fetch发送数据后端无返回

问题分析与解决

核心问题

请求返回空值的根本原因是前端使用了mode: 'no-cors',这是受限的跨域请求模式,会引发两个关键问题:

  • 浏览器会强制修改请求头,把你设置的Content-Type: application/json替换为text/plain,同时丢弃JSON格式的请求体,导致后端通过php://input获取不到数据。
  • 该模式下前端无法读取响应内容(返回的是opaque响应),即使后端返回数据,你也无法通过response.json()解析。

解决方案

1. 修改前端代码(移除mode: 'no-cors')

try {
  const response = await fetch('https://example.com/api', {
      method: 'POST',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        username: 'john'
      })
    });
  const data = await response.json();
  console.log(data.username); // 直接打印出john
} catch (e) {
  console.error(e);
}

说明:改用纯async/await写法,避免混合使用.then(),代码更简洁易读。

2. 后端PHP配置CORS并正确解析请求体

移除no-cors后会触发浏览器的跨域预检请求(OPTIONS),需要后端先处理该请求,再解析POST数据:

<?php
// 配置CORS(开发环境允许所有域名,生产环境请替换为你的前端域名)
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Accept");

// 处理OPTIONS预检请求,直接返回成功
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    exit(0);
}

// 获取请求体并解析为数组
$entityBody = file_get_contents('php://input');
$userData = json_decode($entityBody, true);

// 验证数据并返回结果
if ($userData && isset($userData['username'])) {
    echo json_encode(['username' => $userData['username']]);
} else {
    echo json_encode(['error' => '无效的请求数据']);
}
?>

验证效果

完成上述修改后,前端发送请求时,后端会正确接收到{"username":"john"}的请求体,解析后返回包含username字段的JSON,前端控制台就会打印出john。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:01:04