5.13参数验证
在调用 HTTP 声明式接口方法时,支持验证传递的参数数据的合法性。
在调用 HTTP 声明式接口方法时,支持验证传递的参数数据的合法性。
HTTP 声明式请求通过派生自 ValidationAttribute 的特性来启用参数验证。相应的 HTTP 声明式提取器实现为 ValidationDeclarativeExtractor 类型,该类型负责解析派生自 ValidationAttribute 的特性并对传递的参数数据进行合法性验证。
- 验证单个值和对象数据
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接口的对象数据
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
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.ValidateValue 和 Validator.ValidateObject 方法进行数据验证,支持任意非冻结类型的参数。
- 禁用参数验证
框架提供了 SuppressValidationAttribute 特性,可用于禁用 HTTP 声明式请求的参数验证。将该特性应用于接口时,会禁用该接口下所有方法的参数验证;应用于具体方法时,则仅禁用该方法的参数验证。
public interface IHttpService : IHttpDeclarative{ [SuppressValidation] // 仅禁用 GetStringAsync 方法的参数验证 [Get("https://furion.net/")] Task<string> GetStringAsync([Length(10, 20)] string str, [Required] ValidationModel obj);}[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);}