WebApiClient的接口输入验证

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

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【二分】【SPFA】架设电话线(jzoj 2132)

架设电话线 jzoj 2132 题目大意&#xff1a; 给你一个图&#xff0c;让你从1走到n&#xff0c;问如果可以使k条路的代价变为0&#xff08;自选&#xff09;&#xff0c;那途中走的路的最大值最小是多少 样例输入 5 7 1 1 2 5 3 1 4 2 4 8 3 2 3 5 2 9 3 4 7 4 5 6输入说明…

HDU5528 - Count a * b

HDU5528 - Count a * b 做法&#xff1a;求\(\sum_{m|n}(m^2 - \sum_{i1}^{m}\sum_{j1}^m [m|(ij)])\) \(h(m) \sum_{i1}^{m}\sum_{j1}^m [m|(ij)] \sum_{i1}^m\sum_{j1}^m [\frac{m}{(i,m)}|\frac{i}{(i,m)}j]\) $ \sum_{i1}^m\sum_{j1}^m [\frac{m}{(i,m)}|j] \sum_{i1}^…

CodeForces - 1189B Number Circle

原题传送器<----点我 **题意&#xff1a;**n个数字&#xff0c;请你给它们排个序围成一个环&#xff0c;满足任意一个数两边的数之和大于它本身&#xff0c;例如题目给的图&#xff08;左图为正确答案&#xff09;&#xff0c;如果不存在这样的环就输出NO。 难度★ 题解 …

P7044-[MCOI-03]括号【组合数学】

正题 题目链接:https://www.luogu.com.cn/problem/P7044?contestId36089 题目大意 一个括号序列&#xff0c;0级偏值定义为其中不合法的括号数量。 kkk级偏值定义为它所有子串的k−1k-1k−1级偏值的和。 求这个括号序列的kkk级偏值。 解题思路 后文中我们定义G(x,y)Cxy−1y…

在 .NET Core 应用中使用 NHibernate

NHibernate 最近发布了 5.1.3 版本&#xff0c; 支持 .NET Standard 2.0 &#xff0c; 这意味着可以在 .NET Core 2.0 应用中使用&#xff0c; 本文就已 WebAPI 应用为例&#xff0c; 介绍一下如何在 .NET Core 应用中如何使用 NHibernate 。1、 新建一个基于 .NET Core 的 We…

牛客网【每日一题】3月25日 tokitsukaze and Soldier

牛客网【每日一题】3月25题号&#xff1a;NC50439 名称&#xff1a; tokitsukaze and Soldier 来源&#xff1a;练习赛50-C 链接: link. 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 524288K&#xff0c;其他语言10…

GYM101002C - Greetings!

GYM101002C - Greetings! 做法&#xff1a;\(dp[i][S]\)表示用了\(i\)种信封&#xff0c;明信片的状态为\(S\)时的最小花费&#xff0c;预处理\(A[S]\)表示可以装的对应明信片的集合的花费, \(dp[i][s] min(dp[i-1][s-s2] A[s2]), s2 \in s\)。注意枚举所有子集&#xff0c;再…

P7045-[MCOI-03]金牌【构造,交互题】

正题 题目链接:https://www.luogu.com.cn/problem/P7045?contestId36089 题目大意 nnn个物品有一些颜色&#xff0c;可以询问QQQ次两个物品的颜色是否相同&#xff0c;求一个排列是的相邻的物品颜色不同。其中Q≥2n−2Q\geq 2n-2Q≥2n−2 解题思路 对于每一个不在头尾的物品…

【数学】礼物(jzoj 2129)

礼物 jzoj 2129 题目大意 有1……n,n个礼物盒&#xff0c;第i个礼物盒有i个礼物&#xff0c;现在让你选2个礼物盒&#xff0c;使他是k的倍数 输入样例 1 1 3 2 5 2 50 50 0 0输出样例 0 1 4 24数据范围 20%的数据N<100; 80%的数据K<1000; 每个输入文件最多有200行…

微信小程序与AspNetCore SignalR聊天实例

微信小程序与aspnetcore signalr实例本文不对小程序与signalr做任何介绍,默认读者已经掌握aspnetcore Signalr文档小程序文档写在之前SignalR没有提供小程序使用的客户端js,所以本人参考signlar.js写了小程序版signalr-client.js 代码开源&#xff0c;地址 https://github.com/…

二次重建基本完成辣!

二次重建基本完成辣&#xff01; 实现了一些&#xff0c;之前觉得很有意思的设想&#xff0c;参考了许多dalao的blog解决了手机端突然出现的无法点击链接的问题但是在由于css实现过程中&#xff0c;本人姿势水平不够&#xff0c;Pad和手机无法正常显示。。。适配调整工程过于庞…

纪中C组模拟赛总结(2019.7.12)

成绩&#xff1a; rankrankrank是有算其他dalaodalaodalao的 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4444tjhtjhtjh127.7127.7127.72020200001001001007.77.77.7555lthlthlth120120120202020000100100100000888lyflyflyf107.7107.7107.70000001001001…

牛客网【每日一题】3月26日 合并回文子串

题号&#xff1a;NC13230 名称&#xff1a;合并回文子串 来源&#xff1a;美团2017年CodeM大赛-初赛A轮 题目链接 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 输入两个字…

jzoj5363-[NOIP2017提高A组模拟9.14]生命之树【启发式合并,Trie】

正题 题目大意 nnn个点的一棵树&#xff0c;每个节点有一个值valvalval和一个字符串SSS。对于每个点求∑x∈decp∑y∈decp(x<y)(valxxorvaly)∗∣LCP(Sx,Sy)∣\sum_{x\in dec_p}\sum_{y\in dec_p(x<y)}(val_x\ xor\ val_y)*|LCP(S_x,S_y)|x∈decp​∑​y∈decp​(x<y)…

技术绩效考量:你们可能都做错了

欢迎来到通向卓越之路&#xff01;我们或许都陷入了这样的困境&#xff0c;我们努力成为卓越的企业&#xff0c;我们进行绩效考量&#xff0c;并在此过程中找到正确的OKR、KPI或ABC。但这可能是一件很困难的事情&#xff0c;特别是当我们所在的组织非常复杂并从技术幽灵&#x…

UVALive 8518 - Sum of xor sum

UVALive 8518 - Sum of xor sum 做法&#xff1a;线段树维护&#xff1a;答案&#xff0c;边界在左端点的区间异或为1的个数&#xff0c;边界在右端点异或为1的个数&#xff0c;1的个数&#xff0c;区间长度&#xff0c;这样已经自洽了。&#xff08;每次讲线段树&#xff0c;都…

【结论】取石子游戏(jzoj 1211)

取石子游戏 jzoj 1211 题目大意&#xff1a; 有n个石子&#xff0c;每次可取1~k个石子&#xff08;必须取&#xff09;&#xff0c;问先取者是否有必胜方法 输入样例 2 2 3 3 2输出样例 No Yes数据范围 20%的数据 K≤10 N≤30,000,000 50%的数据 K≤100 N≤2^31-1 100%的…

CodeForces 282E Sausage Maximization(trie+xor)

传送题目 看了半个多小时的题解才搞明白&#xff0c;一下题解为自己的心得 参考博客&#xff08;这两个讲的很详细&#xff09;&#xff1a; 参考一 参考二 题意&#xff1a;有一个长度有n的整数序列&#xff0c;你要在这个序列中选择一个前缀和后缀&#xff0c;前后缀不想交&a…

Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验

Net Core平台灵活简单的日志记录框架NLog初体验前几天分享的"[Net Core集成Exceptionless分布式日志功能以及全局异常过滤][https://www.cnblogs.com/yilezhu/p/9339017.html]" 有人说比较重量&#xff0c;生产环境部署也比较麻烦。因此就有了今天的这篇文章。如果你…

jzoj5365-[GDOI2018模拟9.14]通信【线段树合并】

正题 题目大意 nnn个节点的一棵树&#xff0c;随机选择一个区间&#xff0c;求这个区间的点所构成的虚树的期望权值和。 解题思路 考虑每一条边的贡献&#xff0c;定义一边的点为黑点&#xff0c;一边的为白点&#xff0c;显然包含黑白的区间都会产生贡献。考虑减去没有贡献的…