如何根据模型验证结果同时返回400或422?

问题描述 投票:0回答:1

我正在编写一个 API,用于验证用户发送的有效负载。假设 API 接收邮政编码属性“zipCode”。

我希望模型验证器在邮政编码格式无效时返回 400,并在邮政编码不在有效邮政编码范围内时返回 422。

据我所知,如果出现任何错误,验证器默认返回 400,我可以通过 apiBehaviorOptions 覆盖它,将其更改为 422。但我希望它根据错误返回两者。

有效负载通过控制器中的主体接收,如下所示:

public async Task<IActionResult> ProcessRequest([FromBody] MyRequest request)

可以吗?

c# asp.net-core
1个回答
0
投票

您可以尝试以下示例:
Zip.cs

    public class Zip
    {
        [MyValidation]
        public string zipCode { get; set; }
    }

MyValidation.cs

    public class MyValidation : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            int zipnumber;
            try
            {
                zipnumber = Int32.Parse(value.ToString());    //if cannot parse to int ,set to invalid format error
            }
            catch
            {
                return new ValidationResult("invalid format");
            }
               
            if (zipnumber < 400)  //Just assume the range is less than 400
            {
                return ValidationResult.Success;
            }
            else
            {
                return new ValidationResult("zipcode not in range");
            }
        }
    }

Program.cs(检查错误消息以确定错误代码)

builder.Services.Configure<ApiBehaviorOptions>(o =>
{
    o.InvalidModelStateResponseFactory = actioncontext =>
    {
        var errorlist = actioncontext.ModelState["zipcode"].Errors;
        if (errorlist.Any(x=>x.ErrorMessage== "zipcode not in range"))
        {
            return new UnprocessableEntityObjectResult(actioncontext.ModelState); //422
        }
        return new BadRequestObjectResult(actioncontext.ModelState);   //400
    };
});

测试
帖子:

{"zipcode":"abc"}
{"zipcode":"532"}

© www.soinside.com 2019 - 2024. All rights reserved.