使用HttpClient来异步发送POST请求并解析GZIP回应
.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服务端发送http请求
本来以为对跨域问题的处理已经比较熟练了.可以通过jsonp.document.domain+iframe.window.name.window.postMessage.服务器上设置代理页面来解决.但还 ...
- 通过java代码HttpRequestUtil(服务器端)发送HTTP请求并解析
关键代码:String jsonStr = HttpRequestUtil.sendGet(config.getAddress() + config.getPorts() + config.getFi ...
- iOS-NSURLConnection异步发送 HTTP请求
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { NSString *new = [searchBar.text stri ...
- autojs,autojs 发送http请求,autojs 解析json数据
如题,我这个就直接上代码吧 (function () { let request = http.request; // 覆盖http关键函数request,其他http返回最终会调用这个函数 http ...
- httpclient发送接受请求
需要注意三部分,request和参数的处理,响应数据.与请求相关的dll是System.Net. 核心代码: private string Post(string requestUrlString, ...
- JAVA使用apache http组件发送POST请求
在上一篇文章中,使用了JDK中原始的HttpURLConnection向指定URL发送POST请求 可以看到编码量有些大,并且使用了输入输出流 传递的参数还是用“name=XXX”这种硬编的字符串进行 ...
- Java发布一个简单 webservice应用 并发送SOAP请求
一.创建并发布一个简单的webservice应用 1.webservice 代码: package com.ls.demo; import javax.jws.WebMethod; import ja ...
- Java发布webservice应用并发送SOAP请求调用
webservice框架有很多,比如axis.axis2.cxf.xFire等等,做服务端和做客户端都可行,个人感觉使用这些框架的好处是减少了对于接口信息的解析,最主要的是减少了对于传递于网络中XML ...
- JavaWeb 发送get请求
JavaWeb 发送get请求 CreationTime--2018年6月20日15点27分 Author:Marydon 1.前提 通过HttpClient来实现 2.具体实现 客户端如何发送请 ...
随机推荐
- yii2——自定义widget
参考资料:http://www.bsourcecode.com/yiiframework2/how-to-create-custom-widget-in-yii2-0-framework/ 如何使 ...
- WPF相关开源项目
MahApps 排名第一的是MahApps框架. 该框架不错.详细信息请去官网. cefsharp 能让你在应用中嵌入谷歌浏览器页
- 别老嫌Mac系统难用 这些快捷键你都用过吗
苹果今年10月发布的全新带把儿(bar)的MacBook,轻薄炫酷的外观大受欢迎,其中当然不乏很多从Windows转到Mac阵营的用户.不少习惯了Windows操作习惯的用户在上手Mac时都会觉得非常 ...
- WebServices复习
- 响应者链条,如何获取最佳的点击view 以及内部实现
事件的产生与传递 事件是如何产生与传递的? 当发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中. UIApplication会从时间队列中取出最前面的时间,并将事件 ...
- PE读写
// 仿PE文件.cpp : Defines the entry point for the console application.// #include "stdafx.h"# ...
- MySQL--InnoDB索引原理详解
1 各种树形结构 本来不打算从二叉搜索树开始,因为网上已经有太多相关文章,但是考虑到清晰的图示对理解问题有很大帮助,也为了保证文章完整性,最后还是加上了这部分. 先看看几种树形结构: 1 搜索二叉树: ...
- xss漏洞修复,待完善
1.防止sql注入 /// <summary> /// 分析用户请求是否正常 /// </summary> /// <param name="Str" ...
- Linux面试知识点总结
1.Linux关机重启命令: 在linux命令中reboot是重新启动,shutdown -r now是立即停止然后重新启动,都说他们两个是一样的,其实是有一定的区别的. shutdown命令可 ...
- 用javascript设置和读取cookie的例子
请看下面用javascript设置和读取cookie的简单例子,现在的问题是,如果要设置的是一个cookie集,比如在cookie1集中有uname,uid两组信息,应该如何写呢?cookie(&qu ...