如何处理API响应消息体中的GZIP字符串?
解决GZIP字符串解压的问题
你的问题核心在于:返回的字符串不是直接的GZIP二进制字节的字符串形式,而是**gzip:前缀+Base64编码的GZIP二进制数据**。直接调用compressedString.getBytes()得到的是Base64文本的字节,并非GZIP的原始二进制数据,所以GZIPInputStream无法识别格式。
正确处理步骤:
- 先剥离开头的
gzip:前缀 - 对剩余字符串进行Base64解码,得到真正的GZIP二进制字节数组
- 再用GZIPInputStream解压
Java代码示例
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Base64; import java.util.zip.GZIPInputStream; public class GzipStringDecoder { public static String decodeGzipString(String compressedString) throws IOException { // 1. 移除gzip:前缀 String base64Gzip = compressedString.replaceFirst("^gzip:", ""); // 2. Base64解码获取GZIP二进制字节 byte[] gzipBytes = Base64.getDecoder().decode(base64Gzip); // 3. 解压GZIP数据 try (GZIPInputStream gzipInput = new GZIPInputStream(new ByteArrayInputStream(gzipBytes)); ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = gzipInput.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } return outputStream.toString("UTF-8"); // 根据实际编码调整 } } public static void main(String[] args) throws IOException { String sample = "gzip:H4sIAAAAAAAAALS9665wyXEd9i7zm21U37vnVwwZAREEAZJYgBEjMKq6uiVLNimQlBDRyLtnrX3GD+ACIlEDznyaffbpXV21Vl1W/bdf/vKv/3R/+fWXf/4n17/cX373y/l7/cPfXf+3f/nl1zxWrmW2Vfeev/vlL/p3f/7l1//4f//uF7vvj3+6f/unP/zy63/75T/9p//+CPz97375F/0v//zb3/2q/1X/+sc..."; String result = decodeGzipString(sample); System.out.println(result); } }
注意事项
- 若使用Java 8之前的版本,需依赖第三方库(如Apache Commons Codec的
org.apache.commons.codec.binary.Base64)完成Base64解码 - 解压后的字符串编码要与原始压缩时的编码一致,示例中使用UTF-8,可根据实际场景调整
内容的提问来源于stack exchange,提问作者SW Williams
相关产品推荐
相关产品推荐

