WebApi系列~对HttpClient的响应流进行解压

简介:

有时我们的请求头为ContentEncoding添加了gzip进行了压缩,而服务端返回数据时也会对它进行gzip压缩,如果在这种情况下,你直接头响应流会是乱码,而必须先进行压缩,大叔将这块的逻辑进行了抽取,它把抽取到了方法里,自动使用这个功能!

        /// <summary>
        /// 对流进行解压
        /// </summary>
        /// <param name="response"></param>
        static void UnGZip(HttpResponseMessage response)
        {
            bool isGzip = response.Content.Headers.ContentEncoding.Contains("gzip");
            if (isGzip)
            {
                Stream decompressedStream = new MemoryStream();
                using (var gzipStream = new GZipStream(response.Content.ReadAsStreamAsync().Result, CompressionMode.Decompress))
                {
                    gzipStream.CopyToAsync(decompressedStream);
                }
                decompressedStream.Seek(0, SeekOrigin.Begin);

                var originContent = response.Content;
                response.Content = new StreamContent(decompressedStream);
            }
        }

在GET,POST,PUT,DELETE方法的响应流时,进行装饰,把流进行解压即可!

        public static T Post<T>(string url, object argument = null, CookieContainer cookieContainer = null)
        {
            string sret = "";
            if (cookieContainer == null)
                cookieContainer = new CookieContainer();
            using (HttpClientHandler clientHandler = new HttpClientHandler() { CookieContainer = cookieContainer })
            using (HttpClient client = new HttpClient(clientHandler))
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                string sargument = Newtonsoft.Json.JsonConvert.SerializeObject(argument);
                StringContent argumentContent = new StringContent(sargument, Encoding.UTF8, "application/json");
                HttpResponseMessage response = client.PostAsync(url, argumentContent).Result;
                if (response.IsSuccessStatusCode)
                {
                    UnGZip(response);
                    sret = response.Content.ReadAsStringAsync().Result;
                }
                else
                {
                 throw new Exception(response.StatusCode.ToString());
                }
                if (!string.IsNullOrEmpty(sret))
                {

                    T ret = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(sret);
                    return ret;
                }
                else
                {
                    return default(T);
                }
            }
        }

这样你的响应流就被解开了!

挺方便!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:WebApi系列~对HttpClient的响应流进行解压,如需转载请自行联系原博主。

目录
相关文章
|
图形学 索引
「Unity」基于UnityWebRequest的HTTP文件断点续传
此处需要手动开启协程未考虑网络文件变动的问题,需要的话可以自行进行md5比对若需要分片下载,可以通过修改Range相关值实现 using System;using System.Collections;using System.
5669 0
|
7月前
|
图形学 Android开发
Unity打包安卓报http请求错误
Unity打包安卓报http请求错误
70 1
|
7月前
|
Android开发
qt打包安卓报http请求错误
qt打包安卓报http请求错误
42 0
|
JSON API Apache
基于OkHttp网络通信工具类(发送get、post请求、文件上传和下载)
okhttp是专注于提升网络连接效率的http客户端。 优点: 1、它能实现同一ip和端口的请求重用一个socket,这种方式能大大降低网络连接的时间,和每次请求都建立socket,再断开socket的方式相比,降低了服务器服务器的压力。 2、okhttp 对http和https都有良好的支持。 3、okhttp 不用担心android版本变换的困扰。 4、成熟的网络请求解决方案,比HttpURLConnection更好用。 5、支持异步发送网络请求,响应可在线程处理。
|
7月前
|
网络协议 安全 前端开发
【JavaWeb】知识总结Ⅷ(HTTP协议, GET请求包, POST请求包, 响应包的分析)
1. http 是 TCP/IP 协议的一个应用层协议,http 也是我们 web 开发的基础. http协议特点: 2.基于请求响应模型的:一次请求对应一次响应 3.http协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的 · 缺点:多次请求之间不能共享数据 (java中使用会话技术解决session、cookie) · 优点:速度快
|
XML JSON Linux
安装ApiPost-接口工具 发送HTTP请求
安装ApiPost-接口工具 发送HTTP请求
安装ApiPost-接口工具 发送HTTP请求