Java中的解压缩GZIPed HTTP响应
我正试图使用Java中的解压缩GZIPed HTTP响应,java,gzip,httpresponse,compression,Java,Gzip,Httpresponse,Compression,我正试图使用GZIPInputStream解压gzip管道HTTP响应。但是,当我尝试读取流时,总是会出现相同的异常:java.util.zip.ZipException:invalid bit length repeat 我的HTTP请求头: GET www.myurl.com HTTP/1.0\r\n User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2) Gecko/20100115 Firefox/3.6\r\
GZIPInputStream
解压gzip管道HTTP响应。但是,当我尝试读取流时,总是会出现相同的异常:java.util.zip.ZipException:invalid bit length repeat
我的HTTP请求头:
GET www.myurl.com HTTP/1.0\r\n
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2) Gecko/20100115 Firefox/3.6\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3\r\n
Accept-Encoding: gzip,deflate\r\n
Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7\r\n
Keep-Alive: 115\r\n
Connection: keep-alive\r\n
X-Requested-With: XMLHttpRequest\r\n
Cookie: Some Cookies\r\n\r\n
在HTTP响应头的末尾,我得到了path=/Content Encoding:gzip
,后面是gzip响应
我尝试了两个类似的代码来解压:
更新:在以下代码中,tBytes=('path=/Content Encoding:gzip'后面的字符串。).getBytes()代码>
gzip输入流gzip=new gzip输入流(new ByteArrayInputStream(tBytes));
StringBuffer szBuffer=新的StringBuffer();
字节tByte[]=新字节[1024];
while(true)
{
int iLength=gzip.read(tByte,0,1024);//此处不显示如何获取用于设置gzip流的tBytes
:
GZIPInputStream gzip = new GZIPInputStream (new ByteArrayInputStream (tBytes));
一种解释是,您将整个HTTP响应包含在tBytes
中。相反,它应该只是HTTP头之后的内容
另一种解释是,答案是否定的
编辑:您将内容编码行之后的数据作为消息正文。但是,根据HTTP 1.1规范,头字段没有任何特定顺序,因此这是非常危险的
如本部分所述,请求或响应的消息体不在特定的头字段之后,而是在第一个空行之后:
请求(第5节)和答复
(第6节)消息使用通用
RFC 822[9]的消息格式
传输实体(的有效负载)
消息)。这两种类型的消息
由一条起始线组成,零条或多条
标题字段(也称为
“标题”),空行(即
在CRLF前面没有任何内容的行)
指示标题的结尾
字段,可能还有消息正文
您仍然没有显示如何准确地组合tBytes
,但此时我认为您在尝试解压缩的数据中错误地包含了空行。消息正文在空行的CRLF字符之后开始
我可以建议您使用库来提取消息正文吗?我可以在这里看到一个问题
int iLength = gzip.read (tByte, 0, 1024);
使用以下方法修复该问题
byte[] buff = new byte[1024];
byte[] emptyBuff = new byte[1024];
StringBuffer unGzipRes = new StringBuffer();
int byteCount = 0;
while ((byteCount = gzip.read(buff, 0, 1024)) > 0) {
// only append the buff elements that
// contains data
unGzipRes.append(new String(Arrays.copyOf(
buff, byteCount), "utf-8"));
// empty the buff for re-usability and
// prevent dirty data attached at the
// end of the buff
System.arraycopy(emptyBuff, 0, buff, 0,
1024);
}
您好,Wim。谢谢您的回答。我已经更新了消息以解释如何获取TB。我不认为响应是分块的,因为有一个内容长度头。但我不确定。bill0uteHi Wim。我正在尝试使用HttpClient包,但找不到Java文档。我只得到了示例。您能给我一个连接的小示例吗g到套接字并发送get请求?感谢阅读教程,这是一个获取HTTP get响应体的简单示例:在您的情况下,您将需要处理responseBody
,就像您现在处理tBytes
。嗨,HTTPClient工作正常!太棒了!您编写了,响应是分块的。但是我无法取消分块结果是因为我有一个异常:“坏块头”。我应该打开一个新线程吗?或者解决方法很简单?谢谢!@bill0ute:我会让这成为一个新问题。
int iLength = gzip.read (tByte, 0, 1024);
byte[] buff = new byte[1024];
byte[] emptyBuff = new byte[1024];
StringBuffer unGzipRes = new StringBuffer();
int byteCount = 0;
while ((byteCount = gzip.read(buff, 0, 1024)) > 0) {
// only append the buff elements that
// contains data
unGzipRes.append(new String(Arrays.copyOf(
buff, byteCount), "utf-8"));
// empty the buff for re-usability and
// prevent dirty data attached at the
// end of the buff
System.arraycopy(emptyBuff, 0, buff, 0,
1024);
}