• Flutter实战-请求封装(四)之gzip报文压缩


    98b4b3fb843d3d686b12e4a709e15365.jpeg

    用了两年的flutter,有了一些心得,不虚头巴脑,只求实战有用,以供学习或使用flutter的小伙伴参考,学习尚浅,如有不正确的地方还望各路大神指正,以免误人子弟,在此拜谢~(原创不易,转发请标注来源和作者)

    注意:无特殊说明,flutter版本为3.0+

            上篇我们对flutter的dio请求做了http2的改造,这篇我们来探讨如何进行gzip报文压缩的改造。

    一.何为gzip,为什么我们要使用gzip

         gzip是一种文件压缩技术,Http上的gzip编码是一种通过对报文压缩来改进web应用程序性能的技术。使用了gzip后,可以节省带宽,加快访问速度。

        如果我们要使用gzip,要求服务器端和客户端要同时支持gzip。

    工作原理

    272b0e01d227d50405707a8432c1f779.jpeg

    (图片来源于网络)


    二.服务器支持gzip

    以nginx为例
    #gzip模块设置 
    gzip on; #开启gzip压缩输出 决定是否开启gzip模块,on表示开启,off表示关闭;
    gzip_min_length 1k; #最小压缩文件大小 
    gzip_buffers 4 16k; #压缩缓冲区 
    gzip_http_version 1.1; #压缩版本
     gzip_comp_level 2; #压缩等级,等级越底压缩速度越快文件压缩比越1
    gzip_types text/plain application/x-javascript text/css application/xml; 
    #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。 
    gzip_vary on; #启用应答头"Vary: Accept-Encoding"
     #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

    三.客户端支持gzip

    这里我只进行了返回参数的压缩

    1.添加gzip标识

    dio = Dio(BaseOptions(
        responseDecoder: gzipDecoder,
        headers: {"content-encoding": "gzip", "accept-encoding": "gzip"},
    ));

    2.实现gzipDecoder

    String gzipDecoder(List responseBytes, RequestOptions options, ResponseBody responseBody) {
    if (isGzipped(responseBytes)) {
    return utf8.decode(gzip.decode(responseBytes));
    } else {
    return utf8.decode(responseBytes);
    }
    }

    bool isGzipped(List byte) {
    if (byte.length < 2) {
    return false;
    }
    return ((byte[0].toUnsigned(64)) & 0xff | ((byte[1] << 8).toUnsigned(64) & 0xff00)) == 0x8b1f;
    }




  • 相关阅读:
    开源机密计算平台:蓬莱-OpenHarmony
    RedisTemplate连接密码设置教程
    Xuperchain竞赛环境安装与工作环境搭建
    VAPD AgentKit:可组合 Agent 前端通用库实践
    【算法刷题】——美丽整数的最小增量
    CVPR2022 Oral OGM-GE阅读笔记
    《计算机英语》 Unit 3 Software Engineering 软件工程
    linux中的inode文件编号和软硬链接
    Oracle数据库Bug:相关子查询多层嵌套报错:标识符无效
    2022 Android 高级进阶学习资料与高频精选面试题精讲(圆梦大厂)
  • 原文地址:https://blog.csdn.net/hantian616/article/details/126155750