Elixir:将GZip压缩并Base64编码的API响应转换为字符串
解决Bittrex WebSockets API响应解码问题
我之前在对接Bittrex WebSocket API的时候也踩过这个解码的坑,刚好官方文档的描述很容易让人混淆,咱们一步步拆解解决:
核心逻辑:严格遵循反向处理顺序
官方明确说了服务器的处理流程是:
先使用GZip(通过deflate API,无头部)压缩响应,再进行Base64编码后传输
所以咱们的解码流程必须严格逆向:
- 对收到的Base64字符串做Base64解码,得到二进制压缩数据
- 对二进制数据做Raw Deflate解压(注意是无头部的deflate,不是带gzip/zlib头部的格式)
- 将解压后的二进制数据转成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
相关产品推荐
相关产品推荐

