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)
如何保证全程使用相同的格式?是否有任何内置的标准化方法。
ValidationProblemDetails 类型:
要使自动响应和自定义响应保持一致,请调用该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"};