代码之家  ›  专栏  ›  技术社区  ›  Jehof

自定义验证错误时的自动响应

  •  1
  • Jehof  · 技术社区  · 6 年前

    在ASP.NET Core 2.1中,当发生验证错误时,ApiController将自动响应400 BadRequest。

    如何更改/修改发送回客户机的响应(JSON主体)?有中间件吗?

    我使用FluentValidation来验证发送到控制器的参数,但我对得到的响应不满意。看起来像

    {
        "Url": [
            "'Url' must not be empty.",
            "'Url' should not be empty."
        ]
    }
    

    我想更改响应,因为我们有一些附加到响应的默认值。所以我应该看起来像

    {
        "code": 400,
        "request_id": "dfdfddf",
        "messages": [
            "'Url' must not be empty.",
            "'Url' should not be empty."
        ]
    }
    
    2 回复  |  直到 5 年前
        1
  •  8
  •   Kirk Larkin    6 年前

    这个 ApiBehaviorOptions 类提供生成 ModelState 通过ITS定制响应 InvalidModelStateResponseFactory 属性,其类型为 Func<ActionContext, IActionResult> .

    下面是一个示例实现:

    apiBehaviorOptions.InvalidModelStateResponseFactory = actionContext => {
        return new BadRequestObjectResult(new {
            Code = 400,
            Request_Id = "dfdfddf",
            Messages = actionContext.ModelState.Values.SelectMany(x => x.Errors)
                .Select(x => x.ErrorMessage)
        });
    };
    

    传入的 ActionContext 实例同时提供 ModelState HttpContext 活动请求的属性,它包含我期望您需要的所有内容。我不知道你的 request_id 值来自,所以我将其作为静态示例。

    为了使用此实现,可以配置 行为学 中的实例 ConfigureServices ,就像这样:

    serviceCollection.Configure<ApiBehaviorOptions>(apiBehaviorOptions =>
        apiBehaviorOptions.InvalidModelStateResponseFactory = ...
    );
    
        2
  •  0
  •   Alex Riabov Vikrant    6 年前

    考虑创建自定义 action filer 例如:

    public class CustomValidationResponseActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            if (!context.ModelState.IsValid)
            {
                var errors = new List<string>();
    
                foreach (var modelState in context.ModelState.Values)
                {
                    foreach (var error in modelState.Errors)
                    {
                        errors.Add(error.ErrorMessage);
                    }
                }
    
                var responseObj = new
                {
                    code = 400,
                    request_id = "dfdfddf",
                    messages = errors
                };
    
                context.Result = new JsonResult(responseObj)
                {
                    StatusCode = 400
                };
            }
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        { }
    }
    

    你可以把它登记在 ConfigureServices :

    services.AddMvc(options =>
    {
        options.Filters.Add(new CustomValidationResponseActionFilter());
    });