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
相关产品推荐
相关产品推荐

