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

如何让XHR请求返回201响应码?Laravel场景下的问题排查

问题分析与修复

问题现象

  • POST请求返回200状态码而非预期的201
  • 将数据库插入逻辑移出$_SERVER['REQUEST_METHOD'] == 'post'判断后,数据可正常插入,推测问题出在POST方法验证环节

相关代码

路由定义

Route::post('/send', 'MessagerieController@ajoutMessage')->name('send');

XHR请求代码

xmlhttp.open("post", "/send", true)
xmlhttp.setRequestHeader("X-CSRF-TOKEN", CSRF_TOKEN);

xmlhttp.send(donneesJson)

原控制器代码

if($_SERVER['REQUEST_METHOD'] == 'post'){
    $donneesJson = file_get_contents('php//input');
    $donnees = json_decode($donneesJson);

    DB::table('messages')->insert([
        'content' => 'lol',
        'user_one' => 1,
        'user_two' => 2
    ]);
}

问题原因

$_SERVER['REQUEST_METHOD']的返回值是大写字符串(即'POST'),你写的判断条件用了小写的'post',导致条件不成立,插入逻辑根本没执行,请求返回Laravel默认的200状态码。

另外原代码中file_get_contents('php//input')的路径存在错误,应该是php://input(单斜杠),双斜杠可能导致无法正确读取JSON请求体。

修复方案

修改判断条件为大写的'POST',修正请求体读取路径,并在插入成功后主动返回201状态码:

if($_SERVER['REQUEST_METHOD'] == 'POST'){
    $donneesJson = file_get_contents('php://input');
    $donnees = json_decode($donneesJson);

    DB::table('messages')->insert([
        'content' => 'lol',
        'user_one' => 1,
        'user_two' => 2
    ]);
    
    // 返回201状态码标识资源创建成功
    return response()->json(['status' => 'success'], 201);
}

额外优化建议:在Laravel中更推荐使用框架自带的请求方法判断,比如$request->isMethod('post')(支持大小写不敏感),或者直接依赖路由的POST定义——因为路由已经限定了POST方法,控制器内可以省略方法判断,直接执行逻辑:

public function ajoutMessage(Request $request)
{
    $donnees = $request->json()->all(); // 用Laravel的方法直接获取JSON数据
    
    DB::table('messages')->insert([
        'content' => 'lol',
        'user_one' => 1,
        'user_two' => 2
    ]);
    
    return response()->json(['status' => 'success'], 201);
}

内容的提问来源于stack exchange,提问作者CLOCHARd dasso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:35:18