前提说明:

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请求GET方式和POST方式公共部分,GET方法和POST操作方法类继承基类后通过重写方法实现各自特定的功能。

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

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

2、三种实现类

a、GET请求操作

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

b、Post请求操作

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

c、Post表单请求操作

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

Http网络请求的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. Android之三种网络请求解析数据(最佳案例)

    AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...

  3. IOS开发之—— 在AFN基础上进行的网络请求的封装

    网络请求的思路:如果请求成功的话AFN的responseObject就是解析好的. 1发送网络请求:get/post/或者别的 带上URL,需要传的参数 2判断后台网络状态码有没有请求成功: 3 请求 ...

  4. Android,适合Restful网络请求封装

    借助volley.Gson类库. 优点 网络请求集中处理,返回值直接为预期的对象,不需要手动反序列,提高效率,使用时建立好model类即可. 使用效果 DataProess.Request(true, ...

  5. Android okHttp网络请求之Json解析

    前言: 前面两篇文章介绍了基于okHttp的post.get请求,以及文件的上传下载,今天主要介绍一下如何和Json解析一起使用?如何才能提高开发效率? okHttp相关文章地址: Android o ...

  6. 阶段一:通过网络请求,获得并解析JSON数据(天气应用)

    “阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 在上一篇阶段一:解析JSON中提到,最近在写一个很简单的天气预报应用.即使功能很简单,但我还是想把它做成一个相对完 ...

  7. NSURLSession网络请求

    个人感觉在网上很难找到很简单的网络请求.或许是我才疏学浅 ,  所有就有了下面这一段 , 虽然都是代码 , 但是全有注释 . //1/获取文件访问路径 NSString *path=@"ht ...

  8. 【Swift】Alamofile网络请求数据更新TableView的坑

    写这篇BLOG前,有些话不得不提一下,就仅当发发恼骚吧... 今天下午为了一个Alamofire取得数据而更新TableView的问题,查了一下午的百度(360也是见鬼的一样),竟然没有一个简单明了的 ...

  9. 【WP8.1】HttpClient网络请求、进度以及终止

    工作这么长时间,起初还是喜欢用面向程序过程的思路去写代码. 慢慢的才会用面向对象的思路分析.解决问题.也算是一点点进步吧. 最近在做一个下载音乐的功能.用到了HttpClient类. 于是就简单的写了 ...

  10. ios htttp网络请求cookie的读取与写入(NSHTTPCookieStorage)

    当你访问一个网站时,NSURLRequest都会帮你主动记录下来你访问的站点设置的Cookie,如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,当你 ...

随机推荐

  1. mysql查询优化技巧

    索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存)等等.这里记录的优化技巧更适合开发人员,都是从网络上搜集和整理的,主要是查询语句上的优化,其他层面上 ...

  2. 【Android 错误记录】Conversion to Dalvik format failed with error 1 错误

    错误原因:依赖的包中有冲突,比如依赖了同一个jar包的不同版本等   在以往测试的过程中,出现过几次这个问题,根本原因都是因为有冲突了,但是表现形式可能不一样   情况1: 有一个叫DemoAPP的工 ...

  3. 理解ThreadLocal(一)

    早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. Th ...

  4. 怎么在centos中查看某个目录的树结构?

    1.在ubuntu系统中默认是没有tree这个命令的,需要安装,用下面的命令就可以安装tree这个命令工具sudo apt-get install tree. 在centos中也没有,需要提前进行安装 ...

  5. how to create virtual network in OS X 10.9

    ifconfig lo0 alias 172.16.123.1 will add an alias IP 172.16.123.1 to the loopback adapter sudo ifcon ...

  6. UVA 12563 Jin Ge Jin Qu hao

    dp-背包 开始用普通dp写了一发发现没法确定最大时间... 后来看到大牛机智的写法,嗯...dp表示当前状态能否成立:然后从条件最好的状态开始遍历,直到这个状态成立然后退出遍历. 具体的看代码吧.. ...

  7. Nginx Upload Module 上传模块

    传统站点在处理文件上传请求时,普遍使用后端编程语言处理,如:Java.PHP.Python.Ruby等.今天给大家介绍Nginx的一个模块,Upload Module上传模块,此模块的原理是先把用户上 ...

  8. UIView添加事件

    UIView *loadView = [[UIControl alloc]initWithFrame:CGRectMake(0,0,320,480)]; loadView.backgroundColo ...

  9. sql 数据库 庞大数据量 需要分表

    17:04:05问下 在什么情况下 审核分区啊 ~..大熊..o○ 17:06:53这个要看应用~..大熊..o○ 17:07:37比如数据量很大,查询多是按照时间段查询,就可以用时间段来做分区~.. ...

  10. [Leetcode][Python]44:Wildcard Matching

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 44:Wildcard Matchinghttps://oj.leetcode ...