PHP无需路由接收POST请求体?Postman发JSON返回空$_POST数组
解决PHP无法读取Postman发送的JSON POST请求问题
嘿,作为曾经踩过这个坑的PHP新手,我太懂你的困惑了!你遇到的问题其实是PHP默认的请求解析规则导致的——$_POST数组只负责解析application/x-www-form-urlencoded或者multipart/form-data格式的请求体,而你用Postman发送的是JSON格式的请求,PHP不会自动把它塞进$_POST里,所以才会输出空数组。
解决方案:手动读取并解析JSON请求体
你需要直接读取原始的请求内容,再把它解码成PHP能识别的数组。下面是修改后的完整脚本:
<?php // 读取原始的JSON请求内容(php://input是PHP的输入流) $rawJson = file_get_contents('php://input'); // 把JSON字符串解码成关联数组(第二个参数true确保返回数组而非对象) $postData = json_decode($rawJson, true); if (!empty($postData)) { echo "解析后的JSON数据:<br>"; print_r($postData); echo "<br>"; var_dump($postData); } else { echo "未接收到有效的JSON数据,或者请求体为空。<br>"; // 可以输出原始内容排查问题 echo "原始请求内容:" . $rawJson; } ?>
别忘了检查Postman的设置!
确保你在Postman里做了这两个关键设置:
- 请求头添加Content-Type:在Headers标签里,添加键为
Content-Type,值为application/json的头部(这一步非常重要,告诉PHP你发送的是JSON数据) - Body格式选Raw+JSON:在Body标签里,选择
raw,然后右侧下拉框选JSON,再输入你的JSON内容{"Test": "testValue"}
进阶:兼容多种请求格式
如果之后你的脚本需要同时处理表单提交和JSON请求,可以通过判断请求头的Content-Type来自动适配:
<?php $contentType = $_SERVER['CONTENT_TYPE'] ?? ''; $postData = []; if (strpos($contentType, 'application/json') !== false) { // 处理JSON请求 $rawJson = file_get_contents('php://input'); $postData = json_decode($rawJson, true) ?: []; } else { // 处理普通表单请求 $postData = $_POST; } print_r($postData); ?>
这样不管是表单提交还是JSON请求,脚本都能正确获取到数据啦!
内容的提问来源于stack exchange,提问作者anonymous-dev
相关产品推荐
相关产品推荐

