.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>();//响应头中添加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);
        }

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

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值