如何让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
相关产品推荐
相关产品推荐

