You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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格式请求体传参(推荐)

  1. 调整json_decode的使用逻辑:保留第二个参数true解析为关联数组时,后续用数组下标语法读取参数;如果要沿用对象属性写法,就去掉第二个参数。这里更推荐用关联数组写法,兼容性更好。
  2. 修正Postman测试方法:不要把参数拼在URL后面,选择POST请求方法,进入Body标签页选择raw类型,下拉格式选JSON,在编辑区填入合法JSON参数:
{
    "contenu": "Hello",
    "idUser": 4
}
  1. 修正后的核心代码如下(记得删除调试用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 03:48:10