使用HttpClient来异步发送POST请求并解析GZIP回应
2016-09-02 10:14
483 查看
.NET 4.5(C#): 使用HttpClient来异步发送POST请求并解析GZIP回应
在新的C# 5.0和.NET 4.5环境下,微软为C#加入了async/await,同时还加入新的
System.Net.Http.dll类库。这一切都大大简化了(甚至可以说是革命性得改变了)传统.NET HTTP操作处理的方式。
相比最新的模型,之前.NET 4.0和C# 4.0的时代的HTTP处理方式就显得弱爆了。
首先,如果写成一异步的话。会创造一大堆难看的APM异步执行方法。如果用Lambda的话,就得嵌套多层,也会看着不爽。
其次,关于HTTP特有的,就是用户必须手动把URL参数编码并且正确连接然后放入到HTTP请求中。而.NET 4.5中的
HttpContent类型的多个派生类型可以支持更快捷的HTTP数据内容创建,我们可以使用
FormUrlEncodedContent来完成上述需求。
还有就是自动解压缩HTTP回应中的GZIP的问题:.NET 4.0中在
HttpWebRequest的
AutomaticDecompression属性中,在.NET 4.5中的
HttpClient类型中,可以使用
HttpClientHandler的
AutomaticDecompression属性,前后两者对应值都是
DecompressionMethods枚举类型,这个类型在.NET 2.0就有了。因此命名空间在
System.Net中。
我们可以拿一个街旁网API来做演示,整个过程如下如下:
1. 创建一个HTTP POST请求。
2. 服务器会返回GZip压缩后的数据。
3. 读取并输出结果。
代码如下:
//C# 5.0+ / .NET 4.5+ //+ using System.Net; //+ using System.Net.Http(需引用System.Net.Http.dll类库); static void Main(string[] args) { doo(); System.Threading.Thread.Sleep(-1); } static async void doo() { //设置必要参数 //示例API可以参考:http://dev.jiepang.com/doc/get/users/show var url = "http://api.jiepang.com/v1/users/show"; var userId = "633899402"; //设置HttpClientHandler的AutomaticDecompression var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }; //创建HttpClient(注意传入HttpClientHandler) using (var http = new HttpClient(handler)) { //使用FormUrlEncodedContent做HttpContent var content = new FormUrlEncodedContent(new Dictionary<string, string>() { {"id", userId}, {"force_gzip", "1"} }); //await异步等待回应 var response = await http.PostAsync(url, content); //await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip) Console.WriteLine(await response.Content.ReadAsStringAsync()); } }
运行后,如果成功的话会输出包含用户信息的JSON!
注意:
貌似街旁网已经把这个API改成了了强制OAuth验证(虽然文档上还写着“不需要验证”)。所以运行结果不会输出账户信息,而会输出有包含错误信息的JSON。不过无所谓了,正确输出HTTP回应GZip数据中的结果,就是我们想要的。
注意可以通过
HttpClient类型的
EnsureSuccessStatusCode来确保HTTP回应返回状态成功,否则会抛出异常。
//确保HTTP成功状态值(response对应HttpResponseMessage对象) response.EnsureSuccessStatusCode();
上述API使用了一个显示参数来指定需要返回GZIP数据回应,也可以通过设置HTTP请求的
AcceptEncoding,如下,手动加入GZIP类型:
//+ System.Net.Http; //+ System.Net.Http.Headers //http是HttpClient对象 //也可以手动构建HttpRequestMessage,然后通过HttpClient.SendAsync来发送 http.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("GZIP"));
http变量是
HttpClient对象,它的
DefaultRequestHeaders返回
HttpRequestHeaders对象。当然也可以手动构建
HttpRequestMessage然后修改
HttpRequestHeaders,然后通过
HttpClient.SendAsync来发送。另外注意
StringWithQualityHeaderValue类型在
System.Net.Http.Headers命名空间内。
相关文章推荐
- 使用HttpClient来异步发送POST请求并解析GZIP回应
- 使用HttpClient 发送get、post请求,及其解析xml返回数据
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
- java使用POST发送soap报文请求webservice返回500错误解析
- 如何使用webmagic发送post请求,并解析传回的JSON
- WebApi系列~实际项目中如何使用HttpClient向web api发异步Get和Post请求并且参数于具体实体类型
- 使用httpclient发送get/post请求
- java使用httpclient发送post请求示例
- 使用httpclient发送get或post请求
- Java 中使用 HttpClient 发送 get、post 请求的方法
- 使用HttpClient向HTTPS地址发送POST请求4.1.2
- Objective-C-使用NSMutableURLRequest发送POST请求,使用NSJSONSerialization解析JSON字符串
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
- httpClient使用,1 发送post请求 2 发送get请求取得接口中的数据
- WebApi系列~实际项目中如何使用HttpClient向web api发异步Get和Post请求并且参数于具体实体类型
- 使用apache的httpclient发送post请求传送和解析json
- 使用HttpClient发送POST请求
- 使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传
- 使用HttpClient发送HttpPost请求包含上传本地图片和远程图片的传输实现
- 使用httpclient发送post请求