对比
三者从封装程度从低到高依次为
HttpWebRequest
=>WebClient
=>HttpClient
区别
HttpWebRequset | WebClient | HttpClient | |
---|---|---|---|
命名空间 | System.Net | System.Net | System.Net.Http |
继承类 | WebRequest | Component | HttpMessageInvoker |
支持url转向 | 是 | 否 | 是 |
支持cookie和session | 是 | 否 | 否 |
支持用户代理服务器 | 是 | 否 | 是 |
使用复杂度 | 高 | 低 | 低 |
HttpWebRequest
这是.NET创建者最初开发用于使用HTTP请求的标准类。
使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如 timeouts, cookies, headers, protocols。
另一个好处是HttpWebRequest类不会阻塞UI线程。例如,当您从响应很慢的API服务器下载大文件时,您的应用程序的UI不会停止响应。
HttpWebRequest通常和WebResponse一起使用,一个发送请求,一个获取数据。
HttpWebRquest更为底层一些,能够对整个访问过程有个直观的认识,但同时也更加复杂一些。以GET请求为例,至少需要五行代码才能够实现。
1 | HttpWebRequest http = (HttpWebRequest)WebRequest.Create("http://example.com"); |
工具类
1 | namespace Z.Utils.Common |
Nuget中安装Newtonsoft.Json
JSON转换类
1 | using Newtonsoft.Json; |
AES加密
1 | namespace Z.Utils.Common |
接口
1 | public static async Task<ResultVo<string>> GetMN(string mac) |
文件上传调用
1 | var dic = new NameValueCollection(); |
文件下载带进度
1 | using System; |
这种方法是早期开发者使用的方法,在当前业务中已经很少使用,由于其更加底层,需要处理一些细节,最多可用于框架内部操作。
WebClient(不推荐)
是一种更高级别的抽象,相当于封装了request和response方法
WebClient是一种更高级别的抽象,是HttpWebRequest为了简化最常见任务而创建的,使用过程中你会发现他缺少基本的header,timeoust的设置,不过这些可以通过继承httpwebrequest来实现。
相对来说,WebClient比WebRequest更加简单,它相当于封装了request和response方法,不过需要说明的是,Webclient和WebRequest继承的是不同类,两者在继承上没有任何关系。
使用WebClient可能比HttpWebRequest直接使用更慢(大约几毫秒),但却更为简单,减少了很多细节,代码量也比较少,比如下载文件的代码,只需要两行。
1 | using (WebClient webClient = new WebClient()) |
WebClient主要面向了WEB网页场景,在模拟Web操作时使用较为方便,但用在RestFul场景下却比较麻烦,这时候就需要HttpClient出马了。
HttpClient(推荐)
HttpClient是.NET4.5
引入的一个HTTP客户端库
目前业务上使用的比较多的是HttpClient,它适合用于多次请求操作,一般设置好默认头部后,可以进行重复多次的请求,基本上用一个实例可以提交任何的HTTP请求。此外,HttpClient提供了异步支持,可以轻松配合async await
实现异步请求。
调用发现没有ReadAsAsync
方法
1 | Install-Package Microsoft.AspNet.WebApi.Client |
原因是
这个方法原来是在这个包里的
System.Net.Http.Formatting
,但是它已经废弃了。我们可以在NuGet中找到
Microsoft.AspNet.WebApi.Client
作为替代。
工具类
1 | namespace Z.Utils.Common |
POST请求
1 | var result = await ZHttpAsyncUtil.PostAsync<ResultVo<AppModel>>(url, new Dictionary<string, string>()); |
下载带进度
1 | _ = ZHttpAsyncUtil.DownloadFile( |
文件分片上传
上传
1 | /// <summary> |
调用
1 | NameValueCollection formFields = new NameValueCollection |
获取文件大小
1 | /// <summary> |
读取文件分片
1 | /// <summary> |
获取byte[]的MD5
1 | public static string GetMD5Hash(byte[] bytedata) |
注意点
接口地址拼接
我们直接拼接的时候可能中间的分隔符会重复或缺少,所以建议用下面的方式处理。
1 | string url = new Uri(new Uri(ZConfig.uploadUrl), "/chunkdb/isexist").AbsoluteUri; |
请求参数
Form请求参数
1 | /// <summary> |
contentType
表单
1 | contentType: "application/x-www-form-urlencoded;charset:utf-8;" |
JSON
1 | contentType: "application/json;" |
表单文件上传
1 | contentType: "multipart/form-data;" |
获取网络是否可用
1 | public static bool GetNetStatus() |