#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.