【发布时间】:2021-03-20 21:29:55
【问题描述】:
Java 初学者,我尝试解压缩 Gzip 格式的 HTTP 响应。粗略地说,我有一个 bufferReader,它允许我从套接字读取 http 响应的行。多亏了这一点,我解析了 http 标头,如果它指定正文是 gzip 格式,那么我必须解压缩它。这是我使用的代码:
DataInputStream response = new DataInputStream(clientSideSocket.getInputStream());
BufferedReader buffer = new BufferedReader(new InputStreamReader(response))
header = parseHTTPHeader(buffer); // return a map<String,String> with header options
StringBuilder SBresponseBody = new StringBuilder();
String responseBody = new String();
String line;
while((line = buffer.readLine())!= null) // extract the body as if was a string...
SBresponseBody.append(line);
responseBody = SBresponseBody.toString();
if (header.get("Content-Encoding").contains("gzip"))
responseBody = unzip(responseBody); // function I try to construct
我对解压功能的尝试如下:
private String unzip(String body) throws IOException {
String responseBody = "";
byte[] readBuffer = new byte[5000];
GZIPInputStream gzip = new GZIPInputStream (new ByteArrayInputStream(body.getBytes());
int read = gzip.read(readBuffer,0,readBuffer.length);
gzip.close();
byte[] result = Arrays.copyOf(readBuffer, read);
responseBody = new String(result, "UTF-8");
return responseBody;
}
我在 GZIPInputStream 中收到错误:不是 GZIP 格式(因为在正文中找不到 gzip 标头)。
以下是我的想法:
• body.toByte() 是否错误,因为它已被 bufferReader 作为字符串读取,因此将其转换回 byte[] 没有意义,因为它已经以错误的方式解释?还是我以错误的方式将 Sting 正文重新转换为 byte[]?
• 我是否必须使用 HTTP 标头中提供的信息自己构建 GZIP 标头并将其添加到字符串正文?
• 我是否需要从我的 socket.getInputStream() 创建另一个 InputStream 来逐字节读取信息,还是因为已经有一个缓冲区“连接”到此套接字而变得棘手?
【问题讨论】:
-
这能回答你的问题吗? Uncompress GZIPed HTTP Response in Java