Web Api Validation(参数验证)

10/15/2018 API.NET后端

Web Api Validation(参数验证) 本文首发于个人博客 CoderMiner技术博客 在构建 web api时,参数检查也是一个非常重要的内容,为了提供更好的api接口,需要对用户提交的参数做验证,因为用户提交的数据并不一定都是合法的 验证的技术Model Validation在

# Web Api Validation(参数验证)

本文首发于个人博客 CoderMiner技术博客 (opens new window)

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

# 验证的技术

# Model Validation

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

  • 数据注释
[Required(AllowEmptyStrings = false,ErrorMessage = "not be null or empty")]
public string Name { get; set; }
1
2
  • 实现 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");
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

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

public IHttpActionResult Post(Product product)
{
    if (ModelState.IsValid)
    {
        return Ok();
    }else
    {
        return BadRequest();
    }
}
1
2
3
4
5
6
7
8
9
10

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

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

# 使用 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");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 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; }


}
1
2
3
4
5
6
7
8
9
10

#WebApiConfig.cs中添加

FluentValidationModelValidatorProvider.Configure(config);
1

# 可以使用 Postman进行测试

更多精彩内容 (opens new window)
源码 (opens new window)