gpt4 book ai didi

c# - 为什么自动 modelstate 返回 400 状态代码而不是 422?

转载 作者:行者123 更新时间:2023-12-05 02:28:07 25 4
gpt4 key购买 nike

我有这段代码使用数据注释作为验证。

[Route("api/[controller]")]
[ApiController]
public class AccountController : ControllerBase
{
private readonly IAccountService _accountService;


/// <param name="accountService"></param>
public AccountController(IAccountService accountService)
{
_accountService = accountService;
}

[HttpGet]
[Route("IsAccountClosed/{nric}")]
public async Task<ActionResult> IsAccountClosed([Required] string nric)
{
// code removed for brevity
}
}

当我通过向它传递空字符串(带空格)对其进行测试时,它返回 400 状态代码。下面是大摇大摆的输出。

enter image description here

我的问题是为什么它默认返回 400 状态代码而不是 422 状态代码,后者更准确?如何将其更改为内容类型为 application/problem+json 的 422 状态码?

采用永顺的建议后,我可以得到422状态码,content-type为application/problem+json,但响应体不同,如下所示。

enter image description here

最佳答案

更新

经过一些研究和反复试验,

这就是InvalidModelStateResponseFactory生成状态为 400 的响应。

对于您的情况,您只想覆盖 statusCode 但保留响应结构。

实现:

  1. 获取 ProblemDetailsFactory 服务。

  2. 通过提供当前的 HttpContext、ModelState 和 422 状态代码(没有此 status)创建 ValidationProblemDetails(这是无效模型状态响应主体的结构)在响应正文中将默认为 400)。

  3. 最后,创建 BadRequestObjectResult 并提供状态码 422。

builder.Services.AddControllers()
.ConfigureApiBehaviorOptions(options =>
options.InvalidModelStateResponseFactory = context =>
{
var problemDetailsFactory = context.HttpContext.RequestServices.GetRequiredService<ProblemDetailsFactory>();
ValidationProblemDetails problemDetails = problemDetailsFactory.CreateValidationProblemDetails(context.HttpContext, context.ModelState, 422);

return new ObjectResult(problemDetails)
{
StatusCode = 422
};
}
);

enter image description here

关于c# - 为什么自动 modelstate 返回 400 状态代码而不是 422?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72757979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com