背景:项目链路为腾讯clb->Ingress(nginx)->项目服务,腾讯的Ingress对header请求头最大值为256K,无法加大,由于业务配置数据增加,此问题诟病已久,于是想着压缩打请求头数据后再请求,从而解决请求头大的问题
前端为vue项目
注意:pako的版本必须为1.0.3,否则后端解不开,应该是大于此版本pako做过代码调整,并不兼容历史版本(不要问怎么知道的,我都不知道解了多少,一直提示不是gzip格式,我让前端反解析,前端发现也解不出来,后续我发现是版本问题,坑!)
代码
if (config.data?.headerContentUse) {
config.headers['Content-Encoding'] = 'gzip'
if (ls.get('oldDetailData')) {
let gzip = pako.gzip(encodeURIComponent(JSON.stringify(ls.get('oldDetailData'))), { to: "string" });
const base64 = btoa(gzip);
config.headers['oldContent'] = base64
}
let gzip2 = pako.gzip(encodeURIComponent(JSON.stringify(data)), { to: "string" });
const base642 = btoa(gzip2);
config.headers['newContent'] = base642
}
后端为java项目
代码
if(StringUtils.isNotBlank(oldContent)){
oldContent = this.unZip(oldContent);
}
if(StringUtils.isNotBlank(newContent)){
newContent = this.unZip(newContent);
}
public String unZip(String content) throws IOException {
byte[] gzipBytes = Base64.getDecoder().decode(content);
// 使用GZIPInputStream解压缩
ByteArrayInputStream bais = new ByteArrayInputStream(gzipBytes);
GZIPInputStream gzis = new GZIPInputStream(bais);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = gzis.read(buffer)) > 0) {
baos.write(buffer, 0, len);
}
gzis.close();
baos.close();
// 解码URL编码
return URLDecoder.decode(baos.toString(), "UTF-8");
}