标签:
前提说明:
1、Str.Empty 其实就是 string.Empty
2、@object.IsNull() 的IsNull() 是判断“是否等于null”的扩展方法,等同于 @object==null?true:false;
3、result.IsEmpty() 的IsEmpty() 是判断"字符串是否等于空字符串或null"的扩展方法
一、首先我想要的就是HTTP请求时可以直接把对象扔进去,程序自动就帮我把参数处理好,那就太爽了。
于是上网查找资料发现使用反射可以帮我实现此想法,下面是我的查找及调整后的方法。
说明:
1、ToStr<T>(List<T> @object, char differentiate = ‘=‘, char separator = ‘&‘) where T : new() 是处理 集合类型对象转化为字符串方法,例:A[0].a=xxx&B[0].b=xxx
2、ToStr<T>(T @object, char differentiate = ‘=‘, char separator = ‘&‘) where T : new() 是处理单一对象转化为字符串方法,例:A.a=xxx&A.b=xxx
3、ToListStrByTemplate<T>(List<T> @object, string template) where T : new() 是处理 根据模板处理集合类型对象转化为字符串集合方法,例:[ A[0].a=xxx,B[0].b=xxx ]
4、ToListStrByTemplate<T>(T @object, string template)where T : new() 是处理 根据模板处理单一对象转化为字符串集合方法,例:[ A.a=xxx,A.b=xxx ]
单元测试(因为反射为字符串是调用反射为字符串集合方法,因此只贴出反射为字符串方法的部分单元测试):
到此时,最大的难题已经解决了。看看吧,复杂的对象程序已经能够帮我自动拼装出来了。
其实到这为止差不多就可以结束了,但是谁叫小喵很懒呢,还想HTTP工具方法用起来更容易,用的时候嗖嗖简单几下就OK了,因此又走上了封装(应该这么叫吧)HTTP工具方法的“不归路”上 ^_^。
二、想要HTTP请求方法更加好用
1、首先是基类
抽象基类是抽取Http请求GET方式和POST方式公共部分,GET方法和POST操作方法类继承基类后通过重写方法实现各自特定的功能。
我将HTTP请求分为三种:GET方法、POST方法(网上很普遍的那种,可直接传字符串或拼接“A=xx&B=xx”这样字符串参数)、POST请求Form表单及文件
因此我分为三个类来实现这三种请求方法
2、三种实现类
a、GET请求操作
b、Post请求操作
c、Post表单请求操作
好啦,前期准备都完成啦!!! 当然就现在这样,用起来会很麻烦的,所以咱还得需要一个统一访问的类给他们包装一下,让整个工具用起来能更方便。
3、统一访问类
1 /// <summary> 2 /// 请求网络资源操作 3 /// </summary> 4 public class HttpRequest 5 { 6 /// <summary> 7 /// GET请求 8 /// </summary> 9 /// <param name="url">请求地址</param> 10 public static IHttpGet Get(string url) 11 { 12 return new HttpGet(url); 13 } 14 15 /// <summary> 16 /// POST请求 17 /// </summary> 18 /// <param name="url">请求地址</param> 19 public static IHttpPost Post(string url) 20 { 21 return new HttpPost(url); 22 } 23 24 /// <summary> 25 /// POST表单请求 26 /// </summary> 27 /// <param name="url">请求地址</param> 28 public static IHttpPostForm PostForm(string url) 29 { 30 return new HttpPostForm(url); 31 } 32 33 }
OK,到此为止整个HTTP请求的工具就封装完成了!
我的代码结构是这个样子滴!
4、用法
1 /// <summary> 2 /// 测试PostForm请求 3 /// </summary> 4 [TestMethod] 5 public void TestPostForm() 6 { 7 List<Test_Person> list = new List<Test_Person> 8 { 9 new Test_Person 10 { 11 Name = "张三1", 12 Age = 32, 13 Sex = Test_SexType.Man, 14 Friend = new[] { "a", "b", "c" }, 15 Guids = new[] { new Guid("118d5bb1-1b61-467a-8d7b-42fe42df9e5a"), new Guid("73a02a5b-eaff-45d2-a243-7fa6c5f4792f"), new Guid("53e4bd2f-253e-4db7-96a5-e93e62da5a29") }, 16 Birthday = new DateTime(2016,7,14,10,54,32), 17 aChilds = new[] 18 { 19 new Test_Child 20 { 21 Name = "张小三11", 22 Age = 20, 23 Sex = Test_SexType.WoMan, 24 25 }, 26 new Test_Child 27 { 28 Name = "张小三12", 29 Age = 20, 30 Sex = Test_SexType.WoMan, 31 32 } 33 }, 34 Childs = new List<Test_Child> 35 { 36 new Test_Child 37 { 38 Name = "张小三21", 39 Age = 20, 40 Sex = Test_SexType.WoMan, 41 42 }, 43 new Test_Child 44 { 45 Name = "张小三22", 46 Age = 20, 47 Sex = Test_SexType.WoMan, 48 49 } 50 } 51 }, 52 new Test_Person 53 { 54 Name = "张三2", 55 Age = 32, 56 Sex = Test_SexType.Man, 57 Friend = new[] { "a", "b", "c" }, 58 Guids = new[] { new Guid("118d5bb1-1b61-467a-8d7b-42fe42df9e5a"), new Guid("73a02a5b-eaff-45d2-a243-7fa6c5f4792f"), new Guid("53e4bd2f-253e-4db7-96a5-e93e62da5a29") }, 59 Birthday = new DateTime(2016,7,14,10,54,32), 60 aChilds = new[] 61 { 62 new Test_Child 63 { 64 Name = "张小三11", 65 Age = 20, 66 Sex = Test_SexType.WoMan, 67 68 }, 69 new Test_Child 70 { 71 Name = "张小三12", 72 Age = 20, 73 Sex = Test_SexType.WoMan, 74 75 } 76 }, 77 Childs = new List<Test_Child> 78 { 79 new Test_Child 80 { 81 Name = "张小三21", 82 Age = 20, 83 Sex = Test_SexType.WoMan, 84 85 }, 86 new Test_Child 87 { 88 Name = "张小三22", 89 Age = 20, 90 Sex = Test_SexType.WoMan, 91 92 } 93 } 94 } 95 }; 96 var result = Meow.Webs.HttpRequest.PostForm("http://localhost:63694/App/System/Test").AddLinkData(list).AddData(list).AddData("name", "张三").AddFileData("TestFile", "F:\\MediaResources\\video\\123456.avi").Run(); 97 }
单元测试代码太多就不一一列出了。
总之就是像PostForm表单这样的用法。GET请求参数是添加在URL上的,所以添加方法名就是AddLinkData(),POST也可以在URL带参数,所以POST方法也继承了AddLinkData()方法。
添加参数方式目前仅支持这几种,如有其他需求可联系我,我会跟实用程度决定是否完善。
5、注意:
1、此方法中的POST请求仅限参数是纯字符串(例如XML字符串)的时候使用,其他情况请使用PostForm表单方法。
2、此工具方法中的Run<T>()方法是直接集成了“将返回字符串反序列化成对象”操作(支持Json和Xml,根据传入数据类型决定),具体实现方法后续给出,各位如果要现在使用或没有实现方法,可将此方法删除(不好意思哈)。
3、使用时结束方法为Run(),不调用Run()方法,请求不会执行。
4、此HTTP工具方法采用链式写法,如有不明白的地方请自行查找资料或联系我。
感谢:
首先感谢那些提供给我方法的大神们(提供反射操作方法、HTTP发送POST表单及文件等),因为我找的资料很多,就不把资料地址和作者列出来了。
在此特别感谢博客园大神“何镇汐”对我提供的.NET技术方面的教导,非常感谢!!!
PS:
好啦,作为小白的小喵第一篇原创博客就先写到这了,此工具还没有完全开发完成(如cookie、请求编码方式等仅预留,但尚未提供设置方法),后续会给出完全版。
如果各位大神发现有BUG或更好的建议,麻烦联系我哈,帮我进行完善。
http://demos.telerik.com/aspnet-ajax/dropdowntree/examples/overview/defaultcs.aspx 能实现这个里面所有的功能才就牛逼
标签:
原文地址:http://www.cnblogs.com/Leo_wl/p/5721998.html