使用JS fetch请求PHP API返回200但无法获取数据的问题
检查PHP配置项
enable_post_data_reading是否开启。部分环境会禁用这个选项,导致无法读取POST请求体。可以在api.php里临时添加代码echo ini_get('enable_post_data_reading');查看状态,如果返回off,需要修改php.ini文件设置enable_post_data_reading = On,或者通过.htaccess添加php_value enable_post_data_reading On(仅限Apache环境)。确认前端请求是否发送了完整的JSON payload。打开浏览器开发者工具的Network面板,找到对应的POST请求,查看Payload标签页,确认JSON内容是否正确发送。如果Payload为空,排查前端代码是否有语法错误导致
JSON.stringify失败。改用表单格式发送数据(和HTML FORM一致)。PHP默认只解析
application/x-www-form-urlencoded格式的POST数据到$_POST,而你当前用的是JSON格式。修改前端代码如下:
const url = "http://.../test/test_php_api/api.php"; const queryData = { command: "readUser", email: "john.doe@mailbox.com" }; const body = new URLSearchParams(queryData); var request = new Request(url, { method: 'POST', body: body // 这里可以去掉Content-Type,浏览器会自动设置为application/x-www-form-urlencoded }); fetch(request) .then((response) => { console.log("Response Status", response.status); return response.text(); }) .then((result) => { console.log("result", result); }) .catch((error) => { console.error("Error:", error); });
这样修改后,PHP的$_POST就能正常获取到数据。
排查服务器端是否有拦截请求体的机制。比如安全插件、Nginx配置、CDN服务可能会清空POST请求体。可以在本地搭建测试环境直接访问API,排除服务器端的拦截问题。
检查API代码是否提前读取过请求体。
php://input只能被读取一次,如果API里有其他代码(比如日志记录)已经读取过php://input,后续再读就会返回空。确保读取请求体的代码只执行一次。
内容的提问来源于stack exchange,提问作者reichi

