.Net 5中对于http请求的压缩和解压缩(GZip,Brotli)
背景:(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)相关推荐
- linux 中常见的压缩和解压缩的命令
# linux 中常见的压缩和解压缩的命令 一.tar 1.解压: tar zxvf filename.tar 2.压缩: tar czvf filename.tar dirname 二.gz 1.解 ...
- linux中如何压缩目录文件,如何在Linux中压缩和解压缩目录及其文件
问题描述 我是Linux的新手.什么是压缩和解压缩目录及其文件的完整过程.请提及是否必须进行任何安装. 最佳解决办法 你说你是新手.也许你有Windows-experiences.如果您还没有安装软件 ...
- java ant解压缩_java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解
java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解 发布于 2020-4-7| 复制链接 摘记: java ant包中的org.apache.tools.zip实现 ...
- Linux中的压缩和解压缩命令zip|tar
一. zip 1. 使用zip压缩文件 若使用zip来将文件夹a压缩为a.zip,那么它的语法应该为 语法:zip -q -r [压缩文件名] [被压缩文件或文件夹] 示例:zip -q -r a.z ...
- zip格式压缩和解压缩(支持中文和文件嵌套解压缩)
我在公司项目过程需要用到zip文件的压缩与解压的功能,于是自己研究了一下,找了一些,自己写了一个压缩和解压缩的代码,支持中文,可以文件嵌套(注意其中所用的类是ant.jar中的包中的类,我用的是1.6 ...
- linux zip压缩包大小,Linux中巧用zip命令压缩和解压缩文件
在Windows中,我们用得最多的解压缩软件就是WinRAR了,这个软件对我们实现解压缩非常方便.但是如果在Linux系统中,我们还可以尝试用命令来实现对文件的解压缩,这篇文章主要介绍在Linux中用 ...
- iOS中使用ZipArchive 压缩和解压缩文件
引自 http://www.36duo.com/thread-119-1-1.html 在本教程中,我将演示如何在iOS程序中压缩和解压缩文件.我们将使用一个叫做ZipArchive的第三方库来实现. ...
- JAVA从入门到精通书中ZIP压缩和解压缩错误修正
本人买了一本Java从入门到精通书籍,学到zip压缩和解压这部分,发现按照书上的代码会出现问题,无法完成压缩和解压缩 首先是压缩原文代码: public static void zip(String ...
- MapReduce中的压缩和解压缩
在MR中,压缩是个可选项,是为了减少IO流次数 一.概述 压缩技术能够有效减少底层存储系统(HDFS)读写字节数.压缩提高了网络带宽和磁盘空间的效率.在运行MR程序时,I/O操作.网络数据传输. Sh ...
- Linux中的压缩和解压缩--tar
参数解释 tar命令:用途比较多,可以用于打包,压缩和解压缩等 打包和压缩的区别 打包:将一堆文件或目录变成一个文件 压缩:将一个大文件,通过压缩算法变成一个小文件 Linux中的很多压缩算法只能对一 ...
最新文章
- 上传代码到码云(第一次)
- Silverlight初级教程-开发工具
- 系统设计面试题思路综述
- 用ASP创建MDaemon用户
- IOS沙盒中的Documents、Library、tmp区别
- instanceof 和 对象转型
- Linux后台运行python程序并输出到日志文件
- 2层框架结构柱子间距_钢筋混凝土楼板层其施工方法有哪些不同
- 转:使用java生成数字验证码
- JAVA中Long与Integer踩的坑
- excel查重模型,老板不要再烦我
- qq登陆inc.php,JTBC(php) 版 QQ 一键登录实现过程
- VirtualBox快捷键
- ES性能优化之查询优化笔记(一)
- 使用微信开发工具制作一个简单的古诗词展示微信小程序
- [C#][Windows窗体程序]实现自动出题并判分
- 【收藏】实验室十大常见危险操作,关乎生命!
- 一次美团外卖apk分析学习
- ArcMap欧氏距离运行失败
- 软件架构师应该知道的97件事
热门文章
- Codeforces 821B Okabe and Banana Trees 题解
- 如把联想电脑计算机图标放在桌面上,联想的电脑应用怎么放到桌面图标-?(图)...
- iOS应⽤签名原理浅析
- 网络安全-CTF取证方法大汇总,建议收藏!
- Unity之UI和登陆界面与暂停界面
- 2021级程序设计ICODING答案分享
- Web安全学习day01
- vue2.0怎么渲染html,vue采坑之——vue里面渲染html 并添加样式
- RSCP RSRP RSRQ
- 网易云音乐前副总裁教你如何做产品 —《幕后产品》读书笔记