Laravel项目中JQuery AJAX POST请求报401 Unauthorized错误如何解决
问题解决方案
401 Unauthorized错误修复
401报错为未授权访问,对应修复步骤如下:
- 路由路径匹配校验:你AJAX请求的地址是
/admin/getproductprice,但现有路由定义的是不带admin前缀的/getproductprice,路径不匹配会触发路由规则异常。可二选一调整:要么修改AJAX的url参数为/getproductprice,要么将路由定义修改为Route::post('/admin/getproductprice', [Merchadise_controller::class,'getproductprice'])->name('getproductprice'); - 权限中间件校验:如果你的路由是包裹在带有
auth中间件的admin路由组下,当前账号未登录admin后台时就会返回401错误,要么登录admin账号后测试,要么将该接口路由移出auth中间件组(如果该接口不需要登录权限即可访问)。 - CSRF配置校验:确认页面头部存在
<meta name="csrf-token" content="{{ csrf_token() }}">标签,否则AJAX设置的X-CSRF-TOKEN无法正常取值,也会触发权限类报错。
其他代码逻辑问题修复
解决401问题后,现有代码还存在逻辑错误无法正常获取价格,对应修复如下:
- 参数名不匹配修复:AJAX传给后端的尺寸参数名为
productsize,但控制器查询时用的是$data['productattr_size'],参数名对应不上会导致查询不到数据,需要将控制器查询条件修改为'productattr_size'=>$data['productsize'] - 调试代码清理:控制器中
echo "<pre>";print_r($data);die;这段调试代码会直接终止程序执行,后续价格查询逻辑完全不会运行,需要删除该段代码。 - 空数据异常处理:查询对应尺寸的商品属性时如果不存在对应数据,直接调用
->productattr_price会抛出错误,需要补充非空判断。 - 输出格式调整:控制器接口不要用echo输出内容,直接return返回值即可,AJAX的success回调才能正常获取返回结果。
修复后完整代码示例
修正后的JQuery脚本
$.ajaxSetup({ headers:{ 'X-CSRF-TOKEN':$('meta[name="csrf-token"]').attr('content') } }); $(document).ready(function(){ $('#getprice').change(function(){ var productsize=$(this).val(); if(productsize==""){ alert("please Select size"); return false; } var product_id=$(this).attr("product-id"); $.ajax({ url:'/getproductprice', data:{productsize:productsize,product_id:product_id}, type:'POST', success:function(resp){ $(".getattrprice").html("Sh."+resp); },error:function(xhr){ console.log(xhr.responseText); alert("Error"); } }); }); });
修正后的控制器方法
public function getproductprice(Request $request) { if($request->ajax()){ $data=$request->all(); $getproductprice=Productattribute::where([ 'product_id'=>$data['product_id'], 'productattr_size'=>$data['productsize'] ])->first(); if($getproductprice){ return $getproductprice->productattr_price; } return '0'; } return redirect('admin/merchadise')->with('success','The Merchaise has been created succesfully'); }
修正后的路由配置
// 不需要权限验证时直接放在web.php全局位置,不要嵌套在auth中间件组内 Route::post('/getproductprice', [Merchadise_controller::class,'getproductprice'])->name('getproductprice');
内容的提问来源于stack exchange,提问作者stephen waweru99
相关产品推荐
相关产品推荐

