Laravel 8:如何强制验证错误时返回JSON响应而非302重定向?
解决Laravel 8 API验证错误强制返回JSON的几种方法
方法一:自定义表单请求基类重写验证失败逻辑
如果你的API接口使用Laravel表单请求(Form Request)做参数验证,可以创建一个基础API请求类,让所有API相关请求继承它,在基类里重写failedValidation方法直接返回JSON错误:
<?php namespace App\Http\Requests; use Illuminate\Contracts\Validation\Validator; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\Exceptions\HttpResponseException; class ApiRequest extends FormRequest { protected function failedValidation(Validator $validator) { throw new HttpResponseException( response()->json([ 'status' => 'error', 'message' => '参数验证失败', 'errors' => $validator->errors() ], 422) ); } }
后续你的API请求类只需继承这个ApiRequest而非默认的FormRequest,示例:
class CameraRequest extends ApiRequest { public function rules() { return [ 'camera_id' => 'required|integer', 'image_data' => 'required|string' ]; } }
方法二:修改全局异常处理器
不想逐个修改请求类的话,可在全局异常处理器里拦截ValidationException,强制返回JSON响应。编辑app/Exceptions/Handler.php:
先引入相关类:
use Illuminate\Validation\ValidationException; use Illuminate\Http\JsonResponse;
然后重写render方法(已有则修改对应逻辑):
public function render($request, Throwable $exception) { if ($exception instanceof ValidationException) { return new JsonResponse([ 'status' => 'error', 'message' => '参数验证失败', 'errors' => $exception->errors() ], 422); } return parent::render($request, $exception); }
这样无论请求是否携带Accept: application/json头,验证失败时都会返回JSON格式错误信息。
方法三:强制给API路由设置Accept请求头
在API路由分组中添加中间件,自动为请求设置Accept: application/json头,让Laravel默认返回JSON响应。
首先创建中间件:
php artisan make:middleware ForceJsonResponse
编辑生成的app/Http/Middleware/ForceJsonResponse.php:
<?php namespace App\Http\Middleware; use Closure; class ForceJsonResponse { public function handle($request, Closure $next) { $request->headers->set('Accept', 'application/json'); return $next($request); } }
接着在app/Http/Kernel.php中注册该中间件,加入api中间件组:
protected $middlewareGroups = [ 'api' => [ \App\Http\Middleware\ForceJsonResponse::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
此后所有API路由的请求都会被强制设置Accept头,验证失败时自动返回JSON而非302重定向。
内容的提问来源于stack exchange,提问作者Čamo
相关产品推荐
相关产品推荐

