Laravel API请求验证失败后跳转至登录页问题咨询
问题原因
Laravel 的 $this->validate() 方法会根据请求的类型返回响应:如果请求没有携带 Accept: application/json 请求头,即便用 POST 方法访问 API 路由,Laravel 也会将其判定为 Web 请求。结合路由上的 auth:api 中间件,验证失败后的异常会被处理成登录页跳转,而非返回 API 格式的验证错误。
解决方案
方案一:添加正确的请求头
在 Postman 中给请求添加 Accept: application/json 头,Laravel 会识别为 API 请求,验证失败时自动返回 JSON 格式的错误信息,不会触发跳转。
方案二:使用表单请求类替代控制器内验证
表单请求类在 API 场景下默认返回 JSON 错误,比控制器内验证更适配接口开发:
- 创建表单请求类:
php artisan make:request CreateOrderRequest
- 修改生成的
app/Http/Requests/CreateOrderRequest.php文件:
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\ValidationException; class CreateOrderRequest extends FormRequest { public function authorize(): bool { // 路由已通过 auth:api 中间件校验权限,此处直接返回 true return true; } public function rules(): array { return [ 'name' => 'required', 'phone' => 'required', 'address' => 'required', 'wallet_id' => 'required' ]; } // 自定义验证失败的 JSON 响应格式 protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator) { throw new ValidationException($validator, response()->json([ 'message' => '参数验证失败', 'errors' => $validator->errors() ], 422)); } }
- 在控制器中使用该请求类:
class OrderController extends Controller { public function createOrder(\App\Http\Requests\CreateOrderRequest $request) { // 验证通过后执行业务逻辑 return 'something'; } }
方案三:重写控制器基类的验证逻辑
如果不想使用表单请求类,可以在 App\Http\Controllers\Controller 基类中重写验证方法,强制返回 JSON 响应:
use Illuminate\Http\Request; use Illuminate\Validation\ValidationException; class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; protected function validate(Request $request, array $rules, array $messages = [], array $customAttributes = []) { $validator = $this->getValidationFactory()->make($request->all(), $rules, $messages, $customAttributes); if ($validator->fails()) { throw new ValidationException($validator, response()->json([ 'message' => '参数验证失败', 'errors' => $validator->errors() ], 422)); } } }
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

