如何使 BadRequest 和验证引发的 400 响应具有相同的响应格式?

var*_*ble 6 .net c# asp.net-web-api .net-6.0

我有一个 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."
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

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

return BadRequest("some message")
Run Code Online (Sandbox Code Playgroud)

这返回some message

其中:return BadRequest(new { message = "some message"});返回:

{
    "message": "some message"
}
Run Code Online (Sandbox Code Playgroud)

如何保证全程使用相同的格式?是否有任何内置的标准化方法。

var*_*ble 4

根据文档 - https://learn.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);
Run Code Online (Sandbox Code Playgroud)

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

return ValidationProblem(modelStateDictionary:ModelState, statusCode:401)
Run Code Online (Sandbox Code Playgroud)

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

program.cs

builder.Services.AddControllers()
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressModelStateInvalidFilter=true;
    });
Run Code Online (Sandbox Code Playgroud)

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