使用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来发送。
点击打开链接
另一个之前的缺陷就是用户必须手动把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来发送。
点击打开链接
相关文章推荐
- 使用HttpClient来异步发送POST请求并解析GZIP回应
- 使用HttpClient 发送get、post请求,及其解析xml返回数据
- Objective-C-使用NSMutableURLRequest发送POST请求,使用NSJSONSerialization解析JSON字符串
- WebApi系列~实际项目中如何使用HttpClient向web api发异步Get和Post请求并且参数于具体实体类型
- Java 中使用 HttpClient 发送 get、post 请求的方法
- 使用httpclient发送post请求
- 使用HttpClient发送GET和POST请求
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
- 使用httpclient发送get/post请求
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
- java使用POST发送soap报文请求webservice返回500错误解析
- 使用HttpClient向HTTPS地址发送POST请求4.1.2
- 使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传
- 使用HttpClient发送HttpPost请求包含上传本地图片和远程图片的传输实现
- 使用HttpClient发送GET、POST请求
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
- httpClient使用,1 发送post请求 2 发送get请求取得接口中的数据
- wp8.1使用HttpClient发送post请求数据
- Android+PHP 使用HttpClient提交POST的请求,使用JSON解析响应
- 如何使用webmagic发送post请求,并解析传回的JSON