前后端请求数据gzip压缩方案

本文介绍了前端和后端如何实现数据的gzip压缩和解压。前端使用pako库进行gzip压缩,并通过axios发送base64编码的压缩数据。后端利用hutool工具进行解压操作。在响应处理中,前端接收到数据后同样使用pako进行解压还原。这种方案提高了数据传输效率。
摘要由CSDN通过智能技术生成

前后端请求数据gzip压缩方案

1、前端请求压缩

采用pako工具进行gzip压缩处理

首先引入依赖,在package.json下添加pako依赖

"dependencies": {
    "pako": "^1.0.11"
 }

前端采用axios发送请求,所以在需要请求的接口下进行请求参数的处理

export function save(id, data) {
  return axios({
    url: `/save/${id}`,
    method: "post",
    headers: {'Content-Encoding': 'gzip'},
    data: data,
    transformRequest: [function (data, headers) {
      // 将数据压缩
      const gzip = pako.gzip(encodeURIComponent(JSON.stringify(data)), {to: "string"});
      const base64 = btoa(gzip);
      return base64;
    }],
  });
}

在请求头内添加'Content-Encoding': 'gzip',同时在请求转换器transformRequest内实现数据压缩,首先使用pako将数据进行gzip压缩,然后转为base64提交到后台保存。

2、前端获取数据并解压

通过压缩数据提交到后台保存后,前端获取该数据为压缩后的数据,需要进行解压操作才可以正常使用,解压方法如下:

export function get(id) {
  return axios({
    url: `/get/${id}`,
    method: "get",
    transformResponse: [function (res) {
      res = JSON.parse(res);
      if (res.code === 200) {
        let strData = atob(res.data)
        let charData = strData.split('').map(function (x) { return x.charCodeAt(0); })
        let binData = new Uint8Array(charData)
        let data = pako.inflate(binData)

        strData = ''
        let chunk = 8 * 1024;
        let i;
        for (i = 0; i < data.length / chunk; i++) {
          strData += String.fromCharCode.apply(null, data.slice(i * chunk, (i + 1) * chunk));
        }
        strData += String.fromCharCode.apply(null, data.slice(i * chunk));

        // 解压后数据
        res.data = decodeURIComponent(strData);
      }
      return res;
    }],
  });
}

3、后台获取数据并解压

通常后台从数据库内获取到数据进行操作,这个时候也需要进行解压操作,通过hutool的工具来进行解压

首先引入依赖,在pom.xml文件内添加hutool依赖

<!-- hutool工具类库 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.21</version>
</dependency>

解压代码如下:

String base64 = this.getData(id);
// base64解码
byte[] gzip = Base64.decode(base64);
// gzip解压
String unGzip = ZipUtil.unGzip(gzip, "UTF-8");
// uri解码
String data = URLUtil.decode(unGzip, "UTF-8");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我好高冷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值