背景:(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>();//响应头中添加gzip
options.Providers.Add<BrotliCompressionProvider>();//响应头中添加brotli
options.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);
}
这样响应数据就会自动压缩,再进行后续处理吧文章来源:https://www.toymoban.com/news/detail-447518.html
总结:在编写API接口时,要注意接口响应数据大小和速度,尤其针对于大数据量的返回,可以考虑使用gzip或者br来压缩,当然也可以选择其他压缩方式。文章来源地址https://www.toymoban.com/news/detail-447518.html
到了这里,关于.Net 5中对于http请求的压缩和解压缩(GZip,Brotli)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!