Измерьте точный размер HTTP-ответа в Java HttpResponse

#java #android #apache-httpclient-4.x #androidhttpclient

#java #Android #apache-httpclient-4.x #androidhttpclient

Вопрос:

При использовании a HttpResponse из Apache HttpClient на Java или Android я хотел бы каким-то образом получить точный размер ответа для ведения журнала / анализа.

Возможно ли это?

  • response.getEntity().getContentLength() сервер не должен устанавливать (например, для фрагментированных ответов), поэтому он ненадежен
  • response.getEntity().getContent().available() обычно возвращает 0 , как указано в документации для InputStream

Итак, есть ли какая-либо альтернатива? В частности, я использую либо обычный InputStream , либо a GZIPInputStream и хочу размер необработанных данных (которые были получены с сервера) для сравнения.

Комментарии:

1. Просто извлеките ответ в виде строки. После этого используйте String:length() . Если raw считывает его в массив байтов.

2. @greenapps Спасибо, но как насчет кодировок и проблем с конвертацией? А GZIP является двоичным файлом, так что да, необработанные байты будут тем, на что стоит обратить внимание.

Ответ №1:

Использование String.length() всегда кажется неточным, тем более при обработке двоичного содержимого GZIP. Но это, вероятно, проблемы с кодировкой / кодировкой, верно?

В качестве альтернативы я попытался получить длину InputStream непосредственно из:

 /**
 * Measures the content length using the given InputStream
 * 
 * Usage: inputStream = printResponseLength(inputStream);
 * 
 * @param is the InputStream to measure the content length for
 * @return a copy of the InputStream for further reading
 * @throws Exception if the stream cannot be read
 */
private InputStream printResponseLength(InputStream is) throws Exception {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int len;
    while ((len = is.read(buffer, 0, buffer.length)) != -1) {
        baos.write(buffer, 0, len);
    }
    baos.flush();

    System.out.println("Content-Length: " baos.toByteArray().length);

    return new ByteArrayInputStream(baos.toByteArray());
}
  

Может кто-нибудь подтвердить, верен ли этот метод? По крайней мере, для меня кажется, что он печатает точно такую же длину содержимого, что и консоли разработчика в Firefox / Chrome.