1. 文章目的

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

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类来完成接口方法的参数值输入验证:

/// <summary>

/// 提供参数值和参数的属性值输入合法性验证

/// </summary>

static class ParameterValidator

{

/// <summary>

/// 类型的属性否需要验证缓存

/// </summary>

private static readonly ConcurrentCache<Type, bool> cache = new ConcurrentCache<Type, bool>();

/// <summary>

/// 返回是否需要进行属性验证

/// </summary>

/// <param name="instance">实例</param>

/// <returns></returns>

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)));

}

/// <summary>

/// 验证参数值输入合法性

/// 验证参数的属性值输入合法性

/// </summary>

/// <param name="parameter">参数描述</param>

/// <param name="validateProperty">是否验证属性值</param>

/// <exception cref="ValidationException"></exception>

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<HttpResponseMessage> 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<UserInfo> 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<UserInfo> UpdateWithJsonAsync([Required][JsonContent("yyyy-MM-dd HH:mm:ss")] UserInfo user);

5. 禁用参数的属性验证

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

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

6. 结束语

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

原文地址:https://www.cnblogs.com/kewei/p/9406201.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

WebApiClient的接口输入验证相关推荐

  1. java 错误输入异常_在Java中进行输入验证期间用错误通知替换异常

    java 错误输入异常 在我以前的文章中,我写了一篇关于输入验证设计的文章 ,该设计取代了难以维护和测试的 if-else块. 但是,正如某些读者指出的那样,它有一个缺点–如果输入数据有多个验证错误, ...

  2. rest 验证demo_如何实现REST资源的输入验证

    rest 验证demo 如何实现REST资源的输入验证 我正在使用的SaaS平台具有一个RESTful接口,该接口可以接受XML有效负载. 实施REST资源 对于像我们这样的Java商店,使用JAX- ...

  3. 在Java中进行输入验证时用错误通知替换异常

    在我以前的文章中,我写了一个输入验证设计,该设计取代了难以维护和测试的 if-else块. 但是,正如某些读者指出的那样,它有一个缺点–如果输入数据有多个验证错误,则用户将不得不多次提交请求以查找所有 ...

  4. 如何实现REST资源的输入验证

    如何实现REST资源的输入验证 我正在使用的SaaS平台具有一个RESTful接口,该接口可以接受XML有效负载. 实施REST资源 对于像我们这样的Java商店,使用JAX-B从XML Schema ...

  5. h5开启摄像头拍照+腾讯云接口人脸验证

    前端开启摄像头并拍照将照片的base64码传到后端 <div> //登录弹出框 <el-form ref="form" :model="form&quo ...

  6. 6U CPCI平台学习资料第116篇:基于5VLX110T FPGA FMC接口功能验证6U CPCI平台

    基于5VLX110T FPGA FMC接口功能验证6U CPCI平台 一.板卡概述 本板卡是Xilinx公司芯片V5系列芯片设计信号处理板卡.由一片Xilinx公司的XC5VLX110T-1FF113 ...

  7. 26:第三章:开发通行证服务:9:【注册/登录】接口:验证码校验OK后,先根据手机号去查查该用户是否已存在,如果用户不存在就创建这个用户;(tkmybatis查询构建查询条件,雪花算法,枚举类等等)

    说明: (1)本篇博客内容:继续开发[注册/登录]接口: ● 在[25:第三章:开发通行证服务:8:[注册/登录]接口:接收并校验"手机号和验证码"参数:]中,[注册/登录]接口, ...

  8. jquery中输入验证中一个不错的效果

    在表单的输入验证中,经常要当用户没能正确输入后,要提示"XXXX输入错误" 这一类的信息,如何能搞到动态一点呢,今天发现jquery中的一个不错的效果,笔记之. 1 包含jquer ...

  9. SpringMVC之使用Validator接口进行验证

    对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证.SpringMVC自身对数据在服务端的校验有一个比较好的支持,它能将我们提 ...

最新文章

  1. WinForm下屏幕截图程序的实现
  2. ios 监测网页按钮_苹果IOS备忘录便签软件敬业签恢复删除内容应该怎么操作?...
  3. 【http】记一次http无法连通总是超时的问题
  4. 当我们谈微服务,我们在谈什么?谈谈我对微服务的理解!
  5. 想多了!亚马逊中国没有离开 | 畅言
  6. CentOS7关闭rpcbind连带服务
  7. 软考高级 真题 2014年下半年 信息系统项目管理师 论文
  8. 3000行代码之医院信息管理系统(内附MYSQL语句及背景图片)
  9. 内定抽奖小程序_Excel制作抽奖小程序,单人、多人抽奖只要三步就可实现
  10. HTML5 video(PC和移动端)自动播放学习指北
  11. 西门子1200/1500系列PLC与安川CP-317系列PLC网口通讯
  12. 【zblog】zba解压工具
  13. 爬取起点小说网免费小说
  14. 微信支付(一) - 企业付款到用户零钱
  15. 史上最牛的论坛推广方法,论坛推广实战方案!
  16. opencart修改订单号生成方法
  17. <datart二开>翻牌器侧(纵)轴对齐方式
  18. 相机帧率和曝光时间的关系
  19. 深度学习在基因组学与机器学习在生物医学应用
  20. (LI论文)LIO-Mapping:Tightly Coupled 3D Lidar Inertial Odometry and Mapping

热门文章

  1. 【Spring Cloud】Redis缓存接入监控、运维平台CacheCloud
  2. 在 Linux 下使用 RAID(二):使用 mdadm 工具创建软件 RAID 0 (条带化)
  3. 程序员技术练级攻略(转载)
  4. web页面在线编辑功能
  5. 优化 .NET Core logging 中的泛型 logger
  6. NET问答: 如何从 string 中挖出所有的 number ?
  7. 如何在 ASP.Net Core 中使用 NCache
  8. 【分享】C# 字节帮助类 ByteHelper
  9. 如何在 C# 8 中使用 Index 和 Range
  10. 有温度的技术,改善上亿人的生活