Android GZIP解压缩结果被切断

时间:2011-11-19 23:14:08

标签: android gzip httpclient

我从服务器收到JSON响应,并使用gzip压缩。我尝试了许多解码数据并吐出结果的方法,但是所有这些方法都导致数据被缩短。我没有得到完整的JSON响应。

我根据谷歌的例子使用了以下内容,我相信它应该有效。我错过了其他什么吗?

API.client.addResponseInterceptor(new HttpResponseInterceptor() {
         public void process(final HttpResponse response, final HttpContext context) throws HttpException, IOException {
            HttpEntity entity = response.getEntity();
            Header contentEncodingHeader = entity.getContentEncoding();
            if (contentEncodingHeader != null) {
               HeaderElement[] codecs = contentEncodingHeader.getElements();
               for (int i = 0; i < codecs.length; i++) {
                  if (codecs[i].getName().equalsIgnoreCase(API.GZIP)) {
                     response.setEntity(new GzipDecompressingEntity(response.getEntity()));
                     return;
                  }
               }
            }
         }
      });


static class GzipDecompressingEntity extends HttpEntityWrapper {
          public GzipDecompressingEntity(final HttpEntity entity) {
             super(entity);
          }

          @Override
          public InputStream getContent() throws IOException, IllegalStateException {
             // the wrapped entity's getContent() decides about repeatability
             InputStream wrappedin = wrappedEntity.getContent();
             return new GZIPInputStream(wrappedin);
          }

          @Override
          public long getContentLength() {
             // length of ungzipped content is not known
             return -1;
          }
}

我得到他的回复并使用下面的字符串返回。

response = API.client.execute(postMethod);
        Log.i(LOG_TAG_GENERAL, "STATUS CODE: " + String.valueOf(response.getStatusLine().getStatusCode()));

        BasicResponseHandler handler = new BasicResponseHandler();
        resp = handler.handleResponse(response);

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

您需要致电entity.consumeContent()以确保所有内容都得到处理。最好调用带有处理程序参数的execute方法,它做对了。像这样:

String responseStr = httpclient.execute(get, responseHandler);

对于记录,HttpURLConnection API很糟糕。

答案 1 :(得分:0)

好的,谢谢Mark Murphy(不确定是不是你)和Nikolay。我使用了你的两个建议但仍然收到了相同的错误。但是正因为如此,我更多地关注结果的实际内容。基本上返回的结果太大了,不能简单地吐到日志,我认为可能是这种情况,但生成的JSONArray的长度也更短,但这是由于服务器端的变化,因此我太狭隘和制作一个初级错误。

我对HttpURLConnection为什么“糟透了”感兴趣。我的意思是在视觉上它非常难看打开与输入和输出流等的连接。我坚持使用ResponseInterceptor然而我的HttpURLConnection代码将保持注释并且不会被删除,直到我确定它“糟透了”。