背景:(1)经常会有一些接口返回数据大,导致请求缓慢

(2)在后台请求一些第三方API时,需要解压缩响应数据,再进行处理

解决:可以通过对http请求进行压缩和解压来满足场景需求

1.先了解一下几种不同压缩算法,GZip、Deflate、Brotli

Gzip: Gzip 基于 DEFLATE 算法,它是 LZ77 和霍夫曼编码的组合,最早用于 UNIX 系统的文件压缩。HTTP 协议上的 Gzip 编码是一种用来进 Web 应用程序性能的技术,Web 服务器和客户端(浏览器)必须共同支持 Gzip,当下主流的浏览器都是支持 Gzip 压缩,包括 IE6、IE7、IE8、IE9、FireFox、Google Chrome、Opera 等;

DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。

Brotli:Brotli 是基于LZ77算法的一个现代变体、霍夫曼编码和二阶上下文建模。Google软件工程师在2015年9月发布了包含通用无损数据压缩的Brotli增强版本,特别侧重于HTTP压缩。其中的编码器被部分改写以提高压缩比,编码器和解码器都提高了速度,流式API已被改进,增加更多压缩质量级别。

与常见的通用压缩算法不同,Brotli使用一个预定义的120千字节字典。该字典包含超过13000个常用单词、短语和其他子字符串,这些来自一个文本和HTML文档的大型语料库。预定义的算法可以提升较小文件的压缩密度。

使用Brotli替换Deflate来对文本文件压缩通常可以增加20%的压缩密度,而压缩与解压缩速度则大致不变。

程序后台一般都支持这三种压缩算法,而浏览器中需要查看支持的压缩算法,如果不支持,那么API接口返回的压缩数据不能被自动解压。通过上图浏览器http请求中的request headers中的accept-encoding来查看

2.在.Net 5对接口返回数据进行压缩

(1)在ConfigureServices中注册响应压缩服务

    public void ConfigureServices(IServiceCollection services){services.Configure<GzipCompressionProviderOptions>(options =>{options.Level = CompressionLevel.Optimal;//压缩操作应该被优化压缩,即使操作需要更长的时间才能完成。}).Configure<BrotliCompressionProviderOptions>(options =>{options.Level = CompressionLevel.Optimal;//压缩操作应该被优化压缩,即使操作需要更长的时间才能完成。}).AddResponseCompression(options =>{options.EnableForHttps = true;//是否对https请求压缩options.Providers.Add<GzipCompressionProvider>();//响应头中添加gzipoptions.Providers.Add<BrotliCompressionProvider>();//响应头中添加brotlioptions.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[]{"text/html; charset=utf-8","application/xhtml+xml","application/atom+xml","image/svg+xml"});});services.AddControllers();}

(2).在Configure中启用响应压缩中间件

 app.UseResponseCompression();

(3).这样就配置好了,所有的请求都会压缩后返回,下面看一下响应对比

分别编写一个返回Content和Json的方法:

未配置压缩的响应:

压缩后:

可以看到,响应数据大小减少很多,响应速度也变快了,而同时,加密数据可以被浏览器自动解压缩

3..Net 5解压缩

用普通WebClient请求第三方接口时,返回数据是乱码:

接下来启用解压缩:

(1) 新增继承WebClient的类,并重写GetWebRequest方法:

    public class gZipWebClient : WebClient{protected override WebRequest GetWebRequest(Uri address){HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;//自动gzip解压request.AutomaticDecompression = DecompressionMethods.GZip;return request;}}

(2)用gZipWebClient类进行请求:

   public IActionResult DepressJson(){gZipWebClient wc = new gZipWebClient();wc.Encoding = System.Text.Encoding.UTF8;string url1 = "https://xxx.com/data";string ret1 = wc.DownloadString(url1);return Content(ret1);}

这样响应数据就会自动压缩,再进行后续处理吧

总结:在编写API接口时,要注意接口响应数据大小和速度,尤其针对于大数据量的返回,可以考虑使用gzip或者br来压缩,当然也可以选择其他压缩方式。

.Net 5中对于http请求的压缩和解压缩(GZip,Brotli)相关推荐

  1. linux 中常见的压缩和解压缩的命令

    # linux 中常见的压缩和解压缩的命令 一.tar 1.解压: tar zxvf filename.tar 2.压缩: tar czvf filename.tar dirname 二.gz 1.解 ...

  2. linux中如何压缩目录文件,如何在Linux中压缩和解压缩目录及其文件

    问题描述 我是Linux的新手.什么是压缩和解压缩目录及其文件的完整过程.请提及是否必须进行任何安装. 最佳解决办法 你说你是新手.也许你有Windows-experiences.如果您还没有安装软件 ...

  3. java ant解压缩_java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解

    java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解 发布于 2020-4-7| 复制链接 摘记: java ant包中的org.apache.tools.zip实现 ...

  4. Linux中的压缩和解压缩命令zip|tar

    一. zip 1. 使用zip压缩文件 若使用zip来将文件夹a压缩为a.zip,那么它的语法应该为 语法:zip -q -r [压缩文件名] [被压缩文件或文件夹] 示例:zip -q -r a.z ...

  5. zip格式压缩和解压缩(支持中文和文件嵌套解压缩)

    我在公司项目过程需要用到zip文件的压缩与解压的功能,于是自己研究了一下,找了一些,自己写了一个压缩和解压缩的代码,支持中文,可以文件嵌套(注意其中所用的类是ant.jar中的包中的类,我用的是1.6 ...

  6. linux zip压缩包大小,Linux中巧用zip命令压缩和解压缩文件

    在Windows中,我们用得最多的解压缩软件就是WinRAR了,这个软件对我们实现解压缩非常方便.但是如果在Linux系统中,我们还可以尝试用命令来实现对文件的解压缩,这篇文章主要介绍在Linux中用 ...

  7. iOS中使用ZipArchive 压缩和解压缩文件

    引自 http://www.36duo.com/thread-119-1-1.html 在本教程中,我将演示如何在iOS程序中压缩和解压缩文件.我们将使用一个叫做ZipArchive的第三方库来实现. ...

  8. JAVA从入门到精通书中ZIP压缩和解压缩错误修正

    本人买了一本Java从入门到精通书籍,学到zip压缩和解压这部分,发现按照书上的代码会出现问题,无法完成压缩和解压缩 首先是压缩原文代码: public static void zip(String ...

  9. MapReduce中的压缩和解压缩

    在MR中,压缩是个可选项,是为了减少IO流次数 一.概述 压缩技术能够有效减少底层存储系统(HDFS)读写字节数.压缩提高了网络带宽和磁盘空间的效率.在运行MR程序时,I/O操作.网络数据传输. Sh ...

  10. Linux中的压缩和解压缩--tar

    参数解释 tar命令:用途比较多,可以用于打包,压缩和解压缩等 打包和压缩的区别 打包:将一堆文件或目录变成一个文件 压缩:将一个大文件,通过压缩算法变成一个小文件 Linux中的很多压缩算法只能对一 ...

最新文章

  1. 上传代码到码云(第一次)
  2. Silverlight初级教程-开发工具
  3. 系统设计面试题思路综述
  4. 用ASP创建MDaemon用户
  5. IOS沙盒中的Documents、Library、tmp区别
  6. instanceof 和 对象转型
  7. Linux后台运行python程序并输出到日志文件
  8. 2层框架结构柱子间距_钢筋混凝土楼板层其施工方法有哪些不同
  9. 转:使用java生成数字验证码
  10. JAVA中Long与Integer踩的坑
  11. excel查重模型,老板不要再烦我
  12. qq登陆inc.php,JTBC(php) 版 QQ 一键登录实现过程
  13. VirtualBox快捷键
  14. ES性能优化之查询优化笔记(一)
  15. 使用微信开发工具制作一个简单的古诗词展示微信小程序
  16. [C#][Windows窗体程序]实现自动出题并判分
  17. 【收藏】实验室十大常见危险操作,关乎生命!
  18. 一次美团外卖apk分析学习
  19. ArcMap欧氏距离运行失败
  20. 软件架构师应该知道的97件事

热门文章

  1. Codeforces 821B Okabe and Banana Trees 题解
  2. 如把联想电脑计算机图标放在桌面上,联想的电脑应用怎么放到桌面图标-?(图)...
  3. iOS应⽤签名原理浅析
  4. 网络安全-CTF取证方法大汇总,建议收藏!
  5. Unity之UI和登陆界面与暂停界面
  6. 2021级程序设计ICODING答案分享
  7. Web安全学习day01
  8. vue2.0怎么渲染html,vue采坑之——vue里面渲染html 并添加样式
  9. RSCP RSRP RSRQ
  10. 网易云音乐前副总裁教你如何做产品 —《幕后产品》读书笔记