PHP POST请求body解析失败 php://input获取参数异常排查
问题根因
你的代码和测试方法存在两个核心错误,直接导致参数解析失败:
- 代码语法错误:调用
json_decode时传入了第二个参数true,该配置会将JSON内容解析为关联数组而非对象,但后续代码使用$json->contenu这种对象属性的语法读取参数,根本无法拿到对应值。 - 测试方法错误:你把
contenu、idUser参数直接拼在URL的查询字符串(?后的内容)中,这部分数据不会进入请求体,php://input只能读取POST请求体里的原始内容,URL上的参数PHP会存在$_GET全局变量中,你当前的请求php://input拿到的是空值,json_decode解析后为null,自然会触发参数校验失败的分支。 - 额外问题:你提到的「不带请求体时接口正常运行」实际是错误判断,这时候接口只是走到了返回
INCOMPREHENSIBLE DATA的错误分支,根本没有执行参数解析、数据库插入的核心逻辑,不属于正常运行状态。另外代码里遗留的var_dump($json)调试语句会污染响应格式,后续即使逻辑正确,前端也无法解析合法的JSON返回值。
修复方案
推荐使用第一种方案,符合REST API的通用设计规范,后续对接React前端也更顺畅。
方案1:使用JSON格式请求体传参(推荐)
- 调整
json_decode的使用逻辑:保留第二个参数true解析为关联数组时,后续用数组下标语法读取参数;如果要沿用对象属性写法,就去掉第二个参数。这里更推荐用关联数组写法,兼容性更好。 - 修正Postman测试方法:不要把参数拼在URL后面,选择POST请求方法,进入Body标签页选择
raw类型,下拉格式选JSON,在编辑区填入合法JSON参数:
{ "contenu": "Hello", "idUser": 4 }
- 修正后的核心代码如下(记得删除调试用的var_dump语句):
if ($_SERVER['REQUEST_METHOD'] == 'POST') { require_once('../Configuration/database.php'); require_once('../Users/messages.php'); $database = new Database(); $db = $database->getConnection(); $rawInput = file_get_contents("php://input"); $json = json_decode($rawInput, true); // 先校验JSON解析结果合法性,再校验参数是否存在 if (is_array($json) && !empty($json['contenu']) && !empty($json['idUser'])) { $contenu = strip_tags($json['contenu']); $idUser = intval(strip_tags($json['idUser'])); // 用户ID为数字类型,强转可降低SQL注入风险 $message = new Messages($db); if ($message->addMessage($contenu, $idUser)) { http_response_code(201); $response['message'] = 'GOOD ENTRY'; } else { http_response_code(400); $response['message'] = 'BAD ENTRY'; } } else { http_response_code(400); $response['message'] = 'INCOMPREHENSIBLE DATA'; } echo json_encode($response); } else { http_response_code(405); $response['error_code'] = 405; $response['message'] = 'BAD REQUEST TYPE'; echo json_encode($response); }
方案2:兼容URL参数/表单传参(不推荐)
如果你确实需要支持把参数拼在URL上、或者用表单格式传参,就不需要用php://input解析JSON,直接从PHP超全局变量里取参数即可:
// 同时兼容GET查询参数和POST表单参数 $contenu = $_REQUEST['contenu'] ?? ''; $idUser = $_REQUEST['idUser'] ?? 0;
注意:该方案不符合REST API设计规范,前后端联调时容易出现参数位置不一致的问题,非特殊需求不建议使用。
内容的提问来源于stack exchange,提问作者Zank
相关产品推荐
相关产品推荐

