Laravel中AJAX指定POST却发送GET请求问题求助
先还原下你的问题场景:
我在Laravel项目中遇到一个奇怪的问题:明明把路由定义成了POST方法,AJAX请求也指定了
method: "POST",但实际请求该路由时却自动变成了GET请求。但如果把AJAX的URL指向一个未定义的路由,请求又会正常以POST发送。我的AJAX代码如下:$.ajax({ method: "POST", url: "{{ url('admin/rentacar/save_availability_for_d') }}", headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, data: $(form).serialize(), dataType: "json", success(result){ // 处理逻辑 } })
这种问题我之前排查过好几次,大概率是下面几个原因之一,你可以逐个排查:
路由重定向导致请求方法被转换
最常见的情况是你的目标路由对应的控制器方法里返回了重定向(比如return redirect()->back()或者跳转到其他页面)。Laravel的302重定向会让浏览器自动把POST请求转为GET请求,这就会出现你看到的现象——访问已定义的POST路由时变成GET,而访问未定义的路由时因为没有重定向,POST请求正常发送。
解决办法:打开对应的控制器方法,确认逻辑是否正确,应该直接返回JSON响应(比如return response()->json(['status' => 'success'])),而不是返回重定向。路由定义存在冲突
检查你的routes/web.php(或者对应的路由文件)里,有没有重复定义了admin/rentacar/save_availability_for_d这个路径的GET路由。比如如果先定义了一个GET路由,后面再定义POST路由,可能会导致路由匹配异常。
解决办法:运行php artisan route:list命令,查看所有已注册的路由,确保admin/rentacar/save_availability_for_d只有POST方法的路由,没有其他方法的同名路由。表单默认提交行为没被阻止
如果你是在表单的submit事件里触发的AJAX请求,但忘记阻止表单的默认提交行为,那么浏览器会同时发送两个请求:一个是你写的AJAX POST,另一个是表单默认的GET提交(如果表单没指定method的话)。你在开发者工具里看到的GET请求可能是表单默认提交的那个。
解决办法:在事件处理函数里加上event.preventDefault(),阻止默认行为:$('form').on('submit', function(event) { event.preventDefault(); // 必须加这行,阻止表单默认提交 // 你的AJAX代码放在这里 $.ajax({ method: "POST", url: "{{ url('admin/rentacar/save_availability_for_d') }}", headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, data: $(this).serialize(), dataType: "json", success(result){ // 处理逻辑 } }); });URL末尾的斜杠引发重定向
Laravel默认会对带斜杠的URL进行重定向(去掉斜杠),如果你的AJAX请求URL末尾加了斜杠,而路由定义里没有斜杠,就会触发302重定向,POST请求也会被转为GET。
解决办法:用route()辅助函数生成URL会更可靠,避免手动写路径出错。先给你的POST路由起个名字:Route::post('admin/rentacar/save_availability_for_d', [YourController::class, 'handleSave'])->name('rentacar.save.availability');然后AJAX里的URL改成:
url: "{{ route('rentacar.save.availability') }}"最后再确认下CSRF令牌(虽然你已经加了)
虽然你在headers里携带了CSRF令牌,但可以再确认下页面里的meta标签是否正确,以及令牌值是否能被正确获取。比如打开开发者工具,查看请求头里的X-CSRF-TOKEN是否和页面meta标签里的一致。如果令牌无效,Laravel会返回419错误,但极少数情况下也可能引发异常行为。
内容的提问来源于stack exchange,提问作者Aleksandar Milivojsa

