You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elixir:将GZip压缩并Base64编码的API响应转换为字符串

解决Bittrex WebSockets API响应解码问题

我之前在对接Bittrex WebSocket API的时候也踩过这个解码的坑,刚好官方文档的描述很容易让人混淆,咱们一步步拆解解决:

核心逻辑:严格遵循反向处理顺序

官方明确说了服务器的处理流程是:

先使用GZip(通过deflate API,无头部)压缩响应,再进行Base64编码后传输

所以咱们的解码流程必须严格逆向:

  1. 对收到的Base64字符串做Base64解码,得到二进制压缩数据
  2. 对二进制数据做Raw Deflate解压(注意是无头部的deflate,不是带gzip/zlib头部的格式)
  3. 将解压后的二进制数据转成UTF-8字符串,再解析为JSON

具体代码实现(Node.js zlib模块)

下面是完整的异步处理示例,包含错误捕获:

const zlib = require('zlib');

// 假设从SignalR客户端收到的消息数据为base64EncodedStr
const base64EncodedStr = "你收到的Base64格式响应内容";

// 步骤1:Base64解码为Buffer
const compressedBuffer = Buffer.from(base64EncodedStr, 'base64');

// 步骤2:Raw Deflate解压(关键是设置windowBits参数)
zlib.uncompress(compressedBuffer, { windowBits: -15 }, (err, decompressedBuffer) => {
  if (err) {
    console.error("解压失败,可能是参数错误或数据损坏:", err);
    return;
  }
  
  // 步骤3:转JSON
  try {
    const responseJson = JSON.parse(decompressedBuffer.toString('utf8'));
    console.log("成功解析API响应:", responseJson);
  } catch (parseErr) {
    console.error("JSON解析失败:", parseErr);
  }
});

如果需要同步处理,可以用uncompressSync:

try {
  const compressedBuffer = Buffer.from(base64EncodedStr, 'base64');
  const decompressedBuffer = zlib.uncompressSync(compressedBuffer, { windowBits: -15 });
  const responseJson = JSON.parse(decompressedBuffer.toString('utf8'));
  console.log(responseJson);
} catch (err) {
  console.error("解码失败:", err);
}

你之前失败的常见原因

  • 用错了解压方法:gunzip/gzip方法是处理带gzip头部的压缩数据,而Bittrex用的是无头部的Raw Deflate,必须用uncompress并指定windowBits: -15(-15表示使用Raw Deflate格式,无zlib头部)
  • 处理顺序搞反:如果先解压再Base64解码,肯定会得到乱码或报错
  • 编码问题:解压后的Buffer一定要转成UTF-8字符串,避免JSON解析失败

内容的提问来源于stack exchange,提问作者Aguxez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:55:46