FluentValidation 返回错误时如何返回自定义响应?

Posted

技术标签:

【中文标题】FluentValidation 返回错误时如何返回自定义响应?【英文标题】:How to return custom response when FluentValidation returns an error? 【发布时间】:2021-01-08 18:36:03 【问题描述】:

我正在使用FluentValidation 来验证我的ASP.NET Core 3.1 Web API 的输入。我正在使用“自动”方式进行操作。所以在我的Startup 课堂上我有这个:

        services.AddControllers()
            .AddFluentValidation(opt =>
            
                opt.RegisterValidatorsFromAssemblyContaining(typeof(UserInputValidator));
            );

这样,FluentValidation 会神奇地验证来自上述程序集的所有输入,而无需其他代码。很不错,但是...响应格式与我返回 BadRequest 时使用的响应格式不同。这是 FluentValidation 格式:


    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "|3b037c98-40d28ab8553d6989.",
    "errors": 
        "UserId": [
            "'User Id' must be greater than '0'."
        ],
        "Score": [
            "'Score' must be between 0 and 500. You entered 900."
        ]
    

我宁愿:


    "code": 123456,
    "message": "One or more validation errors occurred.",
    "errors": [
        "'User Id' must be greater than '0'.",
        "'Score' must be between 0 and 500. You entered 900."
    ]

所以我的问题是,是否可以覆盖它?

我有一个想法,但不确定这是否是一种好的做法(甚至可能),但如果 FluentValidation 而不是返回其 BadRequest response 会引发异常,我将能够在中间件中捕获它并重新格式化。

无论如何,FluentValidation 很受欢迎,.NET Core WebAPI 很受欢迎。我很难相信“忍者开发者”只会使用第三方工具提供的响应,这与他们的响应格式不符。然而,我没有看到很多如何修复它的材料(即使在 FluentValidation 网站上也是如此。我错过了吗?

【问题讨论】:

你检查过this @MuhammadHannan 这些答案的问题在于他们没有解决错误代码的问题 【参考方案1】:

您可以通过在 asp.net 核心中使用过滤器来实现此结果。完成 Fluent Validation 的设置后,您必须编写一个过滤器。

 public class CustomValidationAttribute : ActionFilterAttribute
    
        public override void OnActionExecuting(ActionExecutingContext context)
        
            if (!context.ModelState.IsValid)
            
                var errors = context.ModelState.Values.Where(v => v.Errors.Count > 0)
                        .SelectMany(v => v.Errors)
                        .Select(v => v.ErrorMessage)
                        .ToList();

                var responseObj = new
                                        
                    Code= 123456,
                    Message = "One or more validation errors occurred.",
                    Errors = errors
                ;

                context.Result = new JsonResult(responseObj)
                
                    StatusCode = 200
                ;
            
        
    

并在启动类中定义这个过滤器。

services.AddMvc(options =>
            
                options.Filters.Add(typeof(CustomValidationAttribute));
            )
            .AddFluentValidation(fvc => fvc.RegisterValidatorsFromAssemblyContaining<AnyValidatorClass>());

            services.Configure<ApiBehaviorOptions>(options =>
            
                options.SuppressModelStateInvalidFilter = true;
            );

【讨论】:

以上是关于FluentValidation 返回错误时如何返回自定义响应?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 FluentValidation MustAsync 中收到 CS1061 错误

FluentValidation:一个非常受欢迎的,用于构建强类型验证规则的.NET 库

使用Nuget更新FluentValidation后NinjectValidatorFactory出错

Autofac:DependencyResolutionException FluentValidation.IValidator

FluentValidation 和实体框架查找

如何在 Web API 中使用 FluentValidation 执行异步 ModelState 验证?