Получите размер HTTP-ответа в Java

Я хотел бы знать, сколько данных было отправлено в ответ на определенный http-запрос. Что я сейчас делаю, так это:

HttpURLConnection con = (HttpURLConnection) feedurl.openConnection();

//проверить ответ на размер содержимого  int feedsize = con.getContentLength();

Проблема заключается в том, что content-legnth не всегда задается. Например. когда сервер использует transfer-encoding = chunked, я возвращаю значение -1.

Мне нужно не, чтобы отображать информацию о ходе работы. Мне просто нужно знать размер данных, которые были отправлены мне после того, как это было сделано.

Справочная информация. Мне нужна эта информация, потому что я хотел бы сравнить ее с размером ответа, который был отправлен с использованием кодировки gzip.

2 ответа

Я бы использовал commons-io CountingInputStream, который выполнил бы эту работу за вас. Полный, но тривиальный пример:

public long countContent(URL feedurl) {
 CountingInputStream counter = null;
 try {
 HttpURLConnection con = (HttpURLConnection) feedurl.openConnection();
 counter = new CountingInputStream(con.getInputStream());
 String output = IOUtils.toString(counter);
 return counter.getByteCount();
 } catch (IOException ex) {
 throw new RuntimeException(ex);
 } finally {
 IOUtils.closeQuietly(counter);
 }
}


Вы можете расширить FilterInputStream, переопределяя методы read(), read(byte[],int,int) и skip, чтобы после вызова формы super они обновили счетчик с количеством прочитанных байтов.

Затем завершите поток ввода, возвращенный URLConnection одним из них, и используйте обертку вместо исходного потока. Когда вы закончите, вы можете запросить обертку своим счетчиком.

Другие ( "ручные" ) подходы будут использовать инструмент YSlow для сбора статистики в браузере или Wireshark для проверки трафика в сети.

licensed under cc by-sa 3.0 with attribution.