POST请求JSON体接收异常求助:PHP无法获取Postman请求体数据
解决PHP无法接收POST请求JSON体的问题
核心问题分析
你遇到的情况是:POST请求能正常拿到请求头,但$_POST、filter_input_array(INPUT_POST)为空,file_get_contents('php://input')解析JSON后返回NULL。本质原因是JSON格式的请求体不会被PHP自动解析到$_POST,且请求配置或代码可能存在错误。
分步排查与解决
第一步:确认Postman请求配置正确性
从你提供的截图出发,必须确保:- 请求体选择
raw->JSON格式,而非form-data或x-www-form-urlencoded - 请求头包含
Content-Type: application/json(选JSON格式后Postman会自动添加,建议手动检查确认) - 输入的JSON内容格式合法,避免多余逗号、引号不配对等低级错误
- 请求体选择
第二步:调试原始请求体内容
先单独输出原始请求体,确认数据是否真的传到服务器:$payload = file_get_contents('php://input'); var_dump('原始请求体内容:', $payload);如果输出为空,说明请求体未被正确发送或服务器配置拦截了读取:
- 检查
php.ini中enable_post_data_reading是否为On - Nginx用户检查
client_max_body_size设置是否足够,避免请求体被截断
- 检查
第三步:排查JSON解析错误
如果$payload有内容但json_decode返回NULL,用json_last_error_msg()查看具体错误原因:$data = json_decode($payload, true); if ($data === null) { var_dump('JSON解析失败原因:', json_last_error_msg()); }常见错误包括JSON格式不合法、编码不匹配等,根据提示修正即可。
第四步:修正代码误区
注意:$_POST和filter_input_array(INPUT_POST)仅能解析application/x-www-form-urlencoded或multipart/form-data类型的请求体,JSON格式请求不会被填充到这些变量中,所以它们为空是正常现象,不要依赖这两个变量获取JSON数据。
测试用完整代码
// 获取原生请求头(替换你自定义的getRequestHeaders()) $receivedHeaders = getallheaders(); var_dump('请求头:', $receivedHeaders); // 读取原始请求体 $payload = file_get_contents('php://input'); var_dump('原始请求体:', $payload); // 解析并验证JSON $data = json_decode($payload, true); if ($data === null) { var_dump('JSON解析错误:', json_last_error_msg()); } else { var_dump('解析后的数据:', $data); }
内容的提问来源于stack exchange,提问作者alby696
相关产品推荐
相关产品推荐

