Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的解压缩GZIPed HTTP响应_Java_Gzip_Httpresponse_Compression - Fatal编程技术网

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);
                            }