? WebApiClient的接口输入验证_蜘蛛资讯网 ag娱乐平台官网|平台,ag亚洲集团|官方网站,ag亚游vip|官方
首页 > 调查 > 正文

人人车索赔瓜子网_WebApiClient的接口输入验证

1. 文章目的

随着WebApiClient的不断完善,越来越多开发者选择WebApiClient替换原生的HttpClient,本文将介绍WebApiClient的接口参数输入有效性验证的新特性。

1. wen zhang mu di sui zhe WebApiClient de bu duan wan shan, yue lai yue duo kai fa zhe xuan ze WebApiClient ti huan yuan sheng de HttpClient, ben wen jiang jie shao WebApiClient de jie kou can shu shu ru you xiao xing yan zheng de xin te xing.

2.DataAnnotations介绍

asp.net mvc服务端编程中,我们在创建模型的时候,使用System.ComponentModel.DataAnnotations相关的验证特性,配合mvc框架,可以做前端和后端双向输入验证的效果。

public class UserInfo
{
    [Required]
    [StringLength(10, MinimumLength = 1)]
    public string Account { get; set; }

    [Required]
    [StringLength(10, MinimumLength = 6)]
    public string Password { get; set; }
}

以上的Required就是验证特性,asp.net mvc在模型绑定的时候,会进行验证一遍,验证结果放在控制器的ModelState属性里面。当然System.ComponentModel.DataAnnotations并不是asp.net mvc特有的,而是基础库自带的,也就是说任何框架下都是可以使用的。

3. 接口参数值的输入验证

Validator静态类提ValidateObject相关的方法,用于验证实例和实例的属性值,WebApiClient使用Validator类来完成接口方法的参数值输入验证:

/// 
/// 提供参数值和参数的属性值输入合法性验证
/// 
static class ParameterValidator
{
    /// 
    /// 类型的属性否需要验证缓存
    /// 
    private static readonly ConcurrentCache cache = new ConcurrentCache();

    /// 
    /// 返回是否需要进行属性验证
    /// 
    /// 实例
    /// 
    private static bool IsNeedValidateProperty(object instance)
    {
        if (instance == null)
        {
            return false;
        }

        var type = instance.GetType();
        if (type == typeof(string) || type.GetTypeInfo().IsValueType == true)
        {
            return false;
        }

        return cache.GetOrAdd(type, t => t.GetProperties().Any(p => p.CanRead && p.IsDefined(typeof(ValidationAttribute), true)));
    }

    /// 
    /// 验证参数值输入合法性
    /// 验证参数的属性值输入合法性
    /// 
    /// 参数描述
    /// 是否验证属性值
    /// 
    public static void Validate(ApiParameterDescriptor parameter, bool validateProperty)
    {
        var name = parameter.Name;
        var instance = parameter.Value;

        foreach (var validation in parameter.ValidationAttributes)
        {
            validation.Validate(instance, name);
        }

        if (validateProperty == true && IsNeedValidateProperty(instance) == true)
        {
            var ctx = new ValidationContext(instance) { MemberName = name };
            Validator.ValidateObject(instance, ctx, true);
        }
    }
}

4.接口参数的DataAnnotations声明

4.1 声明参数值的验证

例如GetByIdAsync方法有个id的参数,服务器要求必填且最大长度为10的字符串,我们可以使用Required, StringLength(10)特性修饰id这个参数,在接口调用时,WebApiClient会对id值进行验证,如果不通过则抛出ValidationException的异常。

// /GET webapi/user/GetById?id=id001
// Return HttpResponseMessage
[HttpGet("webapi/user/GetById/{id}")]
[BasicAuth("userName", "password")]
ITask GetByIdAsync(
    [Required, StringLength(10)] string id);

4.2 声明参数值的属性验证

对于自定义的模型类型,只要在属性里声明了相关的DataAnnotations,WebApiClient就自动进行属性的输入验证。

public class UserInfo
{
    [Required]
    [StringLength(10, MinimumLength = 1)]
    public string Account { get; set; }

    [Required]
    [StringLength(10, MinimumLength = 6)]
    public string Password { get; set; }
}

// POST webapi/user/UpdateWithJson
// Body {"Account":"laojiu","Password":"123456"}
// Return json或xml内容
[HttpPost("webapi/user/UpdateWithJson")]
ITask UpdateWithJsonAsync(
    [JsonContent("yyyy-MM-dd HH:mm:ss")] UserInfo user);

当user参数不为null的情况,就会验证它的Account和Password两个属性。

4.3 声明参数值、参数的属性值同时验证

对于4.2的例子,如果我们希望user参数值也不能为null,可以如下声明方法:

// POST webapi/user/UpdateWithJson
// Body {"Account":"laojiu","Password":"123456"}
// Return json或xml内容
[HttpPost("webapi/user/UpdateWithJson")]
ITask UpdateWithJsonAsync(
    [Required][JsonContent("yyyy-MM-dd HH:mm:ss")] UserInfo user);

5. 禁用参数的属性验证

如果你的模型的属性已声明验证特性,但不希望WebApiClient进行属性值验证,可以在创建接口实例的时候,在配置项里禁用属性验证:

var config = new HttpApiConfig
{
    UseParameterPropertyValidate = false
};
var client = HttpApiClient.Create(config);

6. 结束语

博主为WebApiClient库的作者,本文向读者介绍了DataAnnotations验证特性在WebApiCiient下的使用方法,欢迎大家给WebApiClient提建议。

当前文章:http://www.mswatej.com/xujen/392206-1115996-67052.html

发布时间:06:14:12

454546铁算盘??本港现场开奖结果报码??2018香港开码结果??跑狗图2018论坛??香港开奖结果历史记录2017??香港赛马会排位表资料??www.90333aa.com??香港波色王??2018开奖记录开奖结果??贵州苏全保论坛??

[责任编辑: 陵建顺]

评论

?
[ 这个月到月的学习计划将帮助您在2019年进入数据科学领域。 ]? [ Bixby或许会更聪明:三星夺得两项世界AI机器阅读理解大赛冠军 ]? [ 迪拜就像我久违的故乡。 ]? [ 中断与美国的外交关系,但继续出售石油 ]? [ 江西省吉安市黑客事件最新进展:学生伤害不严重吉安黑客事件伤害 ]? [ 投入2000万新元!新加坡总理谈为何承办美朝峰会? ]

?
  • 关于我们 | 蜘蛛资讯网 版权所有

    Copyright ? 2019 蜘蛛资讯网 All Rights Reserved