zoukankan      html  css  js  c++  java
  • 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);
                    }
                }
            }

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

    挺方便!

    回到目录

  • 相关阅读:
    DevExpress gridcontrol添加了复选框删除选中的多行/批量删除的方法
    PowerDesigner中在生成的数据库脚本中用name列替换comment列作为字段描述的方法
    int.TryParse 与 int.Parse 的区别
    .NET winform 的keypress事件中判断当用户按下的是哪个键
    XtraReport改变纸张方向
    .NET的 DataTable中某列求和
    SQL UNION 操作符
    如何在VUE中使用leaflet地图框架
    eslint+prettier 的 VSCode配置项
    前端使用Git 切换分支 查看线上远程,本地切换
  • 原文地址:https://www.cnblogs.com/lori/p/7772398.html
Copyright © 2011-2022 走看看