使用axios发起请求时无法获取validate()返回的验证错误
问题原因
Laravel的validate()方法校验失败时,会先判断当前请求类型:如果是期望返回JSON的API/AJAX请求,会返回422状态码的JSON格式错误信息;如果没识别到对应请求头,会默认返回302重定向跳转到上一页。这种302跳转axios会自动跟进,最终拿到200状态码的正常响应,自然不会进入catch回调。
另外你写的验证规则里|分隔符两侧加了空格,会导致Laravel解析规则异常,部分校验规则不生效,也会触发参数错误却走成功流程的问题。
修复步骤
- 全局配置axios默认请求头,让Laravel正确识别API请求
在你的axios初始化代码(一般是项目入口文件或者axios封装文件)里添加以下配置:
axios.defaults.headers.common['Accept'] = 'application/json'; axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
配置完成后,校验失败时Laravel会直接返回422状态码的错误响应,axios会自动进入catch分支,你就能正常通过error.response.data.errors拿到所有校验错误信息。
- 修正后端验证规则格式
去掉规则分隔符|两侧的空格,避免规则解析失效,修改后的校验代码如下:
public function store(Request $request) { $fields = $request->validate([ 'product_name' => 'required', 'product_cost' => 'required|integer', 'product_selling' => 'required|integer', 'product_stock' => 'required|integer', ]); Product::create([ 'name' => $fields['product_name'], 'cost' => $fields['product_cost'], 'selling' => $fields['product_selling'], 'stock' => $fields['product_stock'], ]); }
- 额外说明:你提交的
productState里携带的product_markup、markup_type、returned_errors三个未在校验规则中声明的字段,会被validate()方法自动过滤,不会影响正常校验和入库逻辑,不需要额外处理。
内容的提问来源于stack exchange,提问作者Mishen Thakshana
相关产品推荐
相关产品推荐

