使用curl/Postman向PHP接口POST JSON,var_dump返回NULL问题排查
解决PHP中
file_get_contents('php://input')返回NULL的问题 从你的描述来看,核心矛盾是终端curl请求能正常返回解析后的数组,但网页端直接访问却返回NULL,我来帮你拆解问题并给出解决方案:
先明确核心问题:请求方法不匹配
你在终端用的是POST请求,但网页端直接访问index.php时,浏览器默认发送的是GET请求。而php://input只在POST(且非multipart/form-data格式)请求中才会包含提交的原始数据,GET请求下它是空字符串,json_decode处理空字符串自然返回NULL。
再排查其他可能的异常场景
如果是用Postman测试也返回NULL,那大概率是请求格式不对:
- 你可能没在Postman里正确设置
Content-Type: application/json请求头; - 或者在Postman的Body选项卡选了
form-data/x-www-form-urlencoded格式,而非raw JSON——这种情况下PHP会把数据放到$_POST数组里,php://input依然是空的。
针对性解决方案
1. 让代码兼容GET/POST请求(适配网页访问场景)
如果你需要网页直接访问也能看到数据(比如调试用),可以修改代码区分请求方法:
<?php header('Access-Control-Allow-Origin: *'); header('Content-Type: application/json;charset=utf-8;'); $data = null; // 处理POST请求的JSON数据 if ($_SERVER['REQUEST_METHOD'] === 'POST') { $json = file_get_contents('php://input'); $data = json_decode($json, true); } // 处理GET请求的参数(可选,用于调试) elseif ($_SERVER['REQUEST_METHOD'] === 'GET') { $data = $_GET; } die(var_dump($data)); ?>
2. Postman测试的正确姿势
确保你按以下步骤操作:
- 选择POST请求,填写正确的URL;
- 切换到
Body选项卡,选择raw,格式下拉选JSON; - 粘贴你的JSON数据:
{ "id": "urn:ngsi-ld:Building:store005", "type": "Building" } - 检查Headers里是否存在
Content-Type: application/json(选raw JSON时Postman会自动添加,最好确认下)。
3. 修正curl命令的转义问题
你原curl命令里的"是不必要的,直接用双引号即可(bash终端下注意转义,或者用单引号包裹JSON):
# 正确的curl命令 curl -iX POST http://localhost/rest_api/index.php -H 'Content-Type: application/json' -d '{ "id": "urn:ngsi-ld:Building:store005", "type": "Building" }'
内容的提问来源于stack exchange,提问作者Apostolos Lazidis
相关产品推荐
相关产品推荐

