.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中在HttpWebRequestAutomaticDecompression属性中,在.NET 4.5中的HttpClient类型中,可以使用HttpClientHandlerAutomaticDecompression属性,前后两者对应值都是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回应的更多相关文章

  1. HttpClient服务端发送http请求

    本来以为对跨域问题的处理已经比较熟练了.可以通过jsonp.document.domain+iframe.window.name.window.postMessage.服务器上设置代理页面来解决.但还 ...

  2. 通过java代码HttpRequestUtil(服务器端)发送HTTP请求并解析

    关键代码:String jsonStr = HttpRequestUtil.sendGet(config.getAddress() + config.getPorts() + config.getFi ...

  3. iOS-NSURLConnection异步发送 HTTP请求

    - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { NSString *new = [searchBar.text stri ...

  4. autojs,autojs 发送http请求,autojs 解析json数据

    如题,我这个就直接上代码吧 (function () { let request = http.request; // 覆盖http关键函数request,其他http返回最终会调用这个函数 http ...

  5. httpclient发送接受请求

    需要注意三部分,request和参数的处理,响应数据.与请求相关的dll是System.Net. 核心代码: private string Post(string requestUrlString, ...

  6. JAVA使用apache http组件发送POST请求

    在上一篇文章中,使用了JDK中原始的HttpURLConnection向指定URL发送POST请求 可以看到编码量有些大,并且使用了输入输出流 传递的参数还是用“name=XXX”这种硬编的字符串进行 ...

  7. Java发布一个简单 webservice应用 并发送SOAP请求

    一.创建并发布一个简单的webservice应用 1.webservice 代码: package com.ls.demo; import javax.jws.WebMethod; import ja ...

  8. Java发布webservice应用并发送SOAP请求调用

    webservice框架有很多,比如axis.axis2.cxf.xFire等等,做服务端和做客户端都可行,个人感觉使用这些框架的好处是减少了对于接口信息的解析,最主要的是减少了对于传递于网络中XML ...

  9. JavaWeb 发送get请求

      JavaWeb 发送get请求 CreationTime--2018年6月20日15点27分 Author:Marydon 1.前提 通过HttpClient来实现 2.具体实现 客户端如何发送请 ...

随机推荐

  1. 如何查看/统计当前AD域控制器的活动用户?

    最近公司想知道某台AD域控制器上当前连接了多少活动用户? 此前个人只知道以下不是非常完善且统计起来比较麻烦的方法: 方法1:查看共享会话数.(不完全准确) 方法2:查看当前的DNS记录.(这种方法统计 ...

  2. Gitbook简易教程

    简介 GitBook 是一个基于 Node.js 的命令行工具,可使用 Github/Git 和 Markdown 来制作精美的电子书.GitBook支持输出以下几种文档格式 静态站点:GitBook ...

  3. NGUI制作属于自己Button

    1.收集一些PNG或PSD格式的button按钮图片(放在img文件夹下,全选) 2.选择需要制作button的图片,NGUI--Atlas Maker--Create,会出现三个命名一样的东西,1个 ...

  4. yii2权限控制rbac之菜单menu最详细教程

    前面我们在博文 yii2搭建完美后台并实现rbac权限控制实例教程中完美实现了yii2的后台搭建和rbac权限控制,如果你还没有实现,请先看上文再回来参考本文,因为本文是在上文的基础上进行完善和补充. ...

  5. 【DDD-Apwork框架】事件总线和事件聚合器

    第一步:事件总线和事件聚合器 [1]事件总线 IEventBus IUnitOfWork.cs using System; using System.Collections.Generic; usin ...

  6. Html5 Video 实现方案

    来源:http://ask.dcloud.net.cn/article/569 源码下载 前言: 最近项目中需要用到html5 视频播放功能,于是稍微研究了解了下,遇到了很多坑,特此记录下. 一. H ...

  7. 【ADO.NET】6、SQLHelper简单封装

    using System.Data.SqlClient;using System.Configuration;引用:System.Configuration 连接字符串放到配置文件中 新建一个类,写如 ...

  8. Java实现断点下载Demo

    //1.声明URL String path="http://localhost:8080/day22_DownLoad/file/a.rmvb"; URL url=new URL( ...

  9. bzoj5251 [2018多省省队联测]劈配

    直接网络流模拟即可AC. 可持久化+暴力=90分, 可持久化+二分=30分, 暴力加边+二分=100分. 我也很无奈啊. Ivan便涨红了脸,额上的青筋条条绽出,争辩道,“memcpy也是可持久化…… ...

  10. Zynq系列FPGA如何固化bit文件到QSPI_Flash

    最近由于项目需要,要将bit文件固化到zedboard的flash中,使程序上电自启,断电不丢失. 我们知道,一般板级调试的时候都是直接下载bit流到FPGA就行,固化到Flash的话,也是先生成.m ...