Http网络请求

前提说明:

     1、Str.Empty 其实就是 string.Empty

     2、@object.IsNull() 的IsNull() 是判断“是否等于null”的扩展方法,等同于  @object==null?true:false;

     3、result.IsEmpty() 的IsEmpty() 是判断"字符串是否等于空字符串或null"的扩展方法

一、首先我想要的就是HTTP请求时可以直接把对象扔进去,程序自动就帮我把参数处理好,那就太爽了。

      于是上网查找资料发现使用反射可以帮我实现此想法,下面是我的查找及调整后的方法。

 Reflection 反射操作

     说明:

     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请求基接口
 Http请求操作抽象基类【部分类】
 Http请求操作抽象基类【部分类】

抽象基类是抽取Http请求GET方式和POST方式公共部分,GET方法和POST操作方法类继承基类后通过重写方法实现各自特定的功能。

我将HTTP请求分为三种:GET方法、POST方法(网上很普遍的那种,可直接传字符串或拼接“A=xx&B=xx”这样字符串参数)、POST请求Form表单及文件 

因此我分为三个类来实现这三种请求方法

2、三种实现类

a、GET请求操作

 HttpGet请求操作接口
 HttpGet请求操作【实现类】

b、Post请求操作

 HttpPost请求操作接口
 HttpPost请求操作【部分实现类】
 HttpPost请求操作【部分实现类】

c、Post表单请求操作

 HttpPost表单请求操作接口
 HttpPost表单请求操作【部分实现类】
 HttpPost表单请求操作【部分实现类】
 HttpPost表单文件项类

好啦,前期准备都完成啦!!! 当然就现在这样,用起来会很麻烦的,所以咱还得需要一个统一访问的类给他们包装一下,让整个工具用起来能更方便。

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 能实现这个里面所有的功能才就牛逼

原文地址:https://www.cnblogs.com/Leo_wl/p/5721998.html