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