Web Api Validation(参数验证)

Web Api Validation(参数验证)

本文首发于个人博客 CoderMiner技术博客

在构建 web api时,参数检查也是一个非常重要的内容,为了提供更好的api接口,需要对用户提交的参数做验证,
因为用户提交的数据并不一定都是合法的

验证的技术

Model Validation

ASP.NET中框架提供了一些技术实现数据验证

  • 数据注释

    [Required(AllowEmptyStrings = false,ErrorMessage = "not be null or empty")]
    public string Name { get; set; }
    
  • 实现 IValidatableObject

    public class Product : IValidatableObject
    {
      public string Id { get; set; }
      public string Name { get; set; }
      public string Description { get; set; }
      public double Price { get; set; }
    
      public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
      {
          if(Math.Abs(Price) < 0)
          {
              yield return new ValidationResult("Invalid Price");
          }
      }
    }
    

controller中根据 ModelState.IsValid 查看参数是否合法

public IHttpActionResult Post(Product product)
{
    if (ModelState.IsValid)
    {
        return Ok();
    }else
    {
        return BadRequest();
    }
}

也可以在Action Filter中过滤参数是否合法

public override void OnActionExecuting(HttpActionContext actionContext)
{
    if (!actionContext.ModelState.IsValid)
    {
        actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
    }
}
[ParamsFilter]
public IHttpActionResult Post(Product product)
{
  ...
}

使用 Fluent Validation 进行参数验证

使用第三方库 FluentValidation.WebApi 参数验证

  • 使用 nuget 安装 FluentValidation.WebApi

Product Validator


public class ProductValidator : AbstractValidator<Product>
{
    public ProductValidator()
    {
        RuleFor(x => x.Id).GreaterThan(0).WithMessage("product id must be greater than 0");
        RuleFor(x => x.Name).NotEmpty().WithMessage("the name cannot be blank")
            .Length(0, 100)
            .WithMessage("the name length cannot more than 100 characters");
        RuleFor(x => x.Description).NotEmpty().WithMessage("the des cannot be empty");
        RuleFor(x => x.Price).GreaterThan(0).WithMessage("the price must be greater than 0");
    }
}

Model class

[Validator(typeof(ProductValidator))]
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public double Price { get; set; }


}

WebApiConfig.cs中添加

FluentValidationModelValidatorProvider.Configure(config);

可以使用 Postman进行测试

更多精彩内容
源码