zoukankan      html  css  js  c++  java
  • 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 能实现这个里面所有的功能才就牛逼

  • 相关阅读:
    js的同步和异步
    事件三
    事件2
    JS作用域题
    游戏之乐
    NSTimer(2)
    NSTimer
    理解 Objective-C Runtime
    iOS系统安全机制概览
    Which is the best of GCD, NSThread or NSOperationQueue?
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5721998.html
Copyright © 2011-2022 走看看