Результат декомпрессии Android GZIP обрезан - PullRequest
1 голос
/ 20 ноября 2011

Я получаю ответ JSON с нашего сервера, и он сжимается с помощью gzip.Я перепробовал много способов декодирования данных и получения результата, однако все они приводят к обрыву данных.Я не получаю полный ответ JSON.

Я использовал приведенные ниже примеры Google и уверен, что это должно работать.я скучаю по чему-нибудь еще?

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 ]

1 голос
/ 20 ноября 2011

Вам нужно позвонить entity.consumeContent(), чтобы убедиться, что все обработано.Лучше вызвать метод execute, который принимает параметр обработчика, он делает правильные вещи.Примерно так:

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

Для записи, API HttpURLConnection отстой.

0 голосов
/ 20 ноября 2011

Хорошо, так что спасибо Марку Мерфи (не уверен, что это вы) и Николаю. Я использовал оба ваших предложения и все еще получил те же ошибки. однако из-за этого я больше сосредоточился на фактическом содержании результата. По сути, возвращаемый результат был слишком большим, чтобы просто наплевать на журнал, который, как я предполагал, мог иметь место, но также длина генерируемого JSONArray была короче, однако это было связано с изменением на стороне сервера, поэтому я был слишком узок и сделал младшая ошибка.

Мне интересно, почему HttpURLConnection "отстой". Я имею в виду визуально очень уродливое открытие соединения с входными и выходными потоками и т. Д. Я придерживался только использования ResponseInterceptor, однако мой код для HttpURLConnection останется закомментированным и не будет удален, пока я не буду уверен, что он "отстой".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...