You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 12:16:11