zoukankan      html  css  js  c++  java
  • 使用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中在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命名空间内。

  • 相关阅读:
    html5 canvas 渐变
    html5 canvas 画直线
    html5在canvas中插入图片
    Window文件夹右击菜单定制
    HTML中解决双击会选中文本的问题
    Linux 下修改mysql 字符集编码
    mysqlimport导入命令使用
    PAM 2500 荧光数据导出数据整合脚本
    Resources for Ecology and Evolution
    Plant Ecology Journal Club, 分享主题和文献列表 825, 2019年春
  • 原文地址:https://www.cnblogs.com/Qiaoyq/p/5832386.html
Copyright © 2011-2022 走看看