5.13参数验证

在调用 HTTP 声明式接口方法时,支持验证传递的参数数据的合法性。

在调用 HTTP 声明式接口方法时,支持验证传递的参数数据的合法性。

HTTP 声明式请求通过派生自 ValidationAttribute 的特性来启用参数验证。相应的 HTTP 声明式提取器实现为 ValidationDeclarativeExtractor 类型,该类型负责解析派生自 ValidationAttribute 的特性并对传递的参数数据进行合法性验证。

  • 验证单个值和对象数据
cs
public interface IHttpService : IHttpDeclarative{    // 无需验证参数合法性    [Get("https://furion.net/")]    Task<string> GetStringAsync(string str, object obj);    // 验证参数合法性,支持验证对象模型内部验证特性    [Get("https://furion.net/")]    Task<string> GetStringAsync([Length(10, 20)] string str, [Required] ValidationModel obj);    // 支持为参数添加多个验证规则    [Get("https://furion.net/")]    Task<string> GetStringAsync(        [Required]        [MinLength(2)]        [MaxLength(5)] string str,        [Range(0, 10)] int age);    // 冻结参数类型将被忽略    [Get("https://furion.net/")]    Task<string> GetStringAsync([Required] CancellationToken cancellationToken);}// 对象属性验证public class ValidationModel{    public int Id { get; set; }    [Required]    [MinLength(3)]    public string? Name { get; set; }}
  • 验证实现 IValidatableObject 接口的对象数据
cs
public interface IHttpService : IHttpDeclarative{    [Get("https://furion.net/")]    Task<string> GetStringAsync(ValidationObject obj);}// 实现 IValidatableObject 进行复杂验证public class ValidationObject : IValidatableObject{    public int Id { get; set; }    [Required]    [MinLength(3)]    public string? Name { get; set; }    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)    {        if (Id < 0)        {            yield return new ValidationResult("Id must be greater than or equal to 0.", [nameof(Id)]);        }    }}
  • 验证自定义 ValidationAttribute
cs
public interface IHttpService : IHttpDeclarative{    [Get("https://furion.net/")]    Task<string> GetStringAsync([StringEqual("Furion")] string str);}// 自定义验证特性public class StringEqualAttribute : ValidationAttribute{    public StringEqualAttribute(string value) => Value = value;    public string Value { get; }    /// <inheritdoc />    protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)    {        if (value?.ToString() != Value)        {            return new ValidationResult($"Value is not equal to {Value}.");        }        return ValidationResult.Success;    }}

派生自 ValidationAttribute 的标记和实现 IValidatableObject 接口的参数通过底层 Validator.ValidateValueValidator.ValidateObject 方法进行数据验证,支持任意非冻结类型的参数。

  • 禁用参数验证

框架提供了 SuppressValidationAttribute 特性,可用于禁用 HTTP 声明式请求的参数验证。将该特性应用于接口时,会禁用该接口下所有方法的参数验证;应用于具体方法时,则仅禁用该方法的参数验证。

cs
public interface IHttpService : IHttpDeclarative{    [SuppressValidation]    // 仅禁用 GetStringAsync 方法的参数验证    [Get("https://furion.net/")]    Task<string> GetStringAsync([Length(10, 20)] string str, [Required] ValidationModel obj);}
cs
[SuppressValidation]    // 禁用接口定义的所有方法参数验证public interface IHttpService : IHttpDeclarative{    [Get("https://furion.net/")]    Task<string> GetStringAsync([Length(10, 20)] string str, [Required] ValidationModel obj);    [Get("https://furion.net/")]    [SuppressValidation(false)]    // 启用 GetStringAsync 方法的参数验证    Task<string> GetStringAsync([Length(10, 20)] string str, [Required] ValidationModel obj);}