【问题标题】:How to have the same response format for 400 response raised from BadRequest and validations?如何对从 BadRequest 和验证引发的 400 响应具有相同的响应格式?
【发布时间】:2022-02-02 00:04:54
【问题描述】:

我有一个 DTO,它是 API POST 端点的输入参数。

DTO 已获得数据注释并且自动进行验证。下面是一个例子:

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "00-f14406a8950b1005234cc79298a79586-77222ebbed97e453-00",
    "errors": {
        "Email": [
            "The Email field is not a valid e-mail address."
        ]
    }
}

但是,当我想从控制器引发 400 响应时,请使用以下任一方法:

return BadRequest("some message")

这会返回some message

这里:return BadRequest(new { message = "some message"}); 返回:

{
    "message": "some message"
}

如何确保始终使用相同的格式?有没有内置的标准化方法。

【问题讨论】:

  • 返回BadRequest时如何返回404?请详细说明您要达到的目标。
  • 对不起,我的意思是 400,更新了问题。

标签: c# .net asp.net-web-api .net-6.0


【解决方案1】:

根据文档 - https://docs.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-6.0#default-badrequest-response

ValidationProblemDetails 类型:

  • 提供一种机器可读的格式,用于指定 Web API 响应中的错误。
  • 符合 RFC 7807 规范。

要使自动响应和自定义响应保持一致,请调用 ValidationProblem 方法而不是 BadRequest。

ValidationProblem 返回一个 ValidationProblemDetails 对象以及自动响应。

例子:

ModelState.AddModelError("Name", "Invalid name");
return ValidationProblem(ModelState);

您可以在所有响应代码中使用此概念 - 例如 - 代替 400(ValidationProblem 的默认值),您可以通过将最后一行替换为以下代码来返回 401:

return ValidationProblem(modelStateDictionary:ModelState, statusCode:401)

如果您不想使用此响应格式并希望拥有自己的响应格式,则必须禁用负责自动模型验证和 400 响应的中间件:

在program.cs:

builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressModelStateInvalidFilter=true;
    });

现在在控制器中,您必须自己进行验证(例如:检查空值)和return BadRequest(new {error = "type something here"};

【讨论】:

    【解决方案2】:

    按如下方式创建基础 api 控制器:

    [ApiController]
    public abstract class ApiControllerBase : ControllerBase
    {        
        protected virtual IActionResult InvalidModelState() {
            return HttpContext.RequestServices.GetService<IOptions<ApiBehaviorOptions>>()
                .Value.InvalidModelStateResponseFactory(ControllerContext);
        }
    }
    

    并从ApiControllerBase 派生您的 api 控制器。 每当您想添加错误并使用相同格式的验证错误时,只需添加 ModelState.AddModelError("", "Your error message") 然后 return InvalidModelState();。

    【讨论】:

    • 这个不清楚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2021-02-05
    • 2020-07-24
    • 1970-01-01
    相关资源
    最近更新 更多