向PHP发送JSON格式POST请求时$_POST为空是什么原因?
问题原因
PHP的$_POST超全局变量默认仅会自动解析两类Content-Type的POST请求数据,自动填充到数组中:
application/x-www-form-urlencoded:普通HTML表单默认的POST提交格式multipart/form-data:支持文件上传的表单POST提交格式
当你在Postman中选择JSON格式提交数据时,请求头的Content-Type为application/json,PHP不会自动解析这类请求体填充到$_POST,因此直接读取$_POST['nombre']会得到空值,无法进入对应判断分支。
修复方案
要获取JSON格式提交的POST参数,需要手动读取PHP原始请求输入流,再对JSON内容做解码处理,示例代码如下:
// 读取原始POST请求体内容 $rawRequest = file_get_contents('php://input'); // 将JSON格式的请求体解析为关联数组 $requestData = json_decode($rawRequest, true); if( isset($requestData['nombre']) ){ echo("Do thing"); } else{ echo("Error"); }
如果需要同时兼容普通表单提交、JSON提交两种场景,可以增加请求类型判断做兼容处理:
$requestData = $_POST; // 检测当前请求是否为JSON格式提交 if (stripos($_SERVER['CONTENT_TYPE'], 'application/json') !== false) { $rawRequest = file_get_contents('php://input'); $jsonData = json_decode($rawRequest, true); if (is_array($jsonData)) { $requestData = array_merge($requestData, $jsonData); } } if( isset($requestData['nombre']) ){ echo("Do thing"); } else{ echo("Error"); }
注意:
php://input是PHP提供的可读取原始请求体的只读流,在enctype="multipart/form-data"格式的请求中不可用,这类请求PHP已经自动处理填充到$_POST和$_FILES中,不需要手动读取。
内容的提问来源于stack exchange,提问作者Fran Pino
相关产品推荐
相关产品推荐

