您的位置:首页 > 理论基础 > 计算机网络

使用HttpClient来异步发送POST请求并解析GZIP回应

2013-08-02 16:19 567 查看
在.NET 4.0和C# 4.0的时代,写成异步的话,这将会写比较多的代码,而且我保证代码不会很好看,因为一大堆APM异步执行代码的结果就是要么一层一层的嵌套Lambda,要么一段逻辑被迫分割成一堆方法。

另一个之前的缺陷就是用户必须手动把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来做演示,整个代码如下:

//+ using System.Net;

//+ using System.Net.Http;

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
= "772653441";

var
source
= "Mgen.Orca";

//设置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},

{"source",
source},

{"force_gzip",
"1"}

});

//await异步等待回应

var
response
= await
http.PostAsync(url,
content);

//确保HTTP成功状态值

response.EnsureSuccessStatusCode();

//await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)

Console.WriteLine(await
response.Content.ReadAsStringAsync());

}

}

运行后,有网络的话会输出账号的Json信息!

上述API使用了一个显示参数来指定需要返回GZIP数据回应,也可以通过设置HTTP请求的AcceptEncoding,如下,手动加入GZIP类型:

//http是HttpClient对象

//也可以手动构建HttpRequestMessage,然后通过HttpClient.SendAsync来发送

http.DefaultRequestHeaders.AcceptEncoding.Add(new
StringWithQualityHeaderValue("GZIP"));

http是HttpClient对象,它的DefaultRequestHeaders返回HttpRequestHeaders对象。当然也可以手动构建HttpRequestMessage然后修改HttpRequestHeaders,然后通过HttpClient.SendAsync来发送。

点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: