我正在编写一个 API,用于验证用户发送的有效负载。假设 API 接收邮政编码属性“zipCode”。
我希望模型验证器在邮政编码格式无效时返回 400,并在邮政编码不在有效邮政编码范围内时返回 422。
据我所知,如果出现任何错误,验证器默认返回 400,我可以通过 apiBehaviorOptions 覆盖它,将其更改为 422。但我希望它根据错误返回两者。
有效负载通过控制器中的主体接收,如下所示:
public async Task<IActionResult> ProcessRequest([FromBody] MyRequest request)
可以吗?
您可以尝试以下示例:
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"}