Получить размер HTTP-ответа в Java
-
16-09-2019 - |
Вопрос
Я хотел бы знать, сколько данных было отправлено в ответ на определенный http-запрос.То, что я сейчас делаю, это:
HttpURLConnection con = (HttpURLConnection) feedurl.openConnection();
//проверьте ответ на размер содержимого int feedsize = con.getContentLength();
Проблема в том, что длина содержимого задана не всегда.Например.когда сервер использует transfer-encoding=chunked, я получаю обратно значение -1.
Я знаю не это нужно для отображения информации о ходе выполнения.Мне просто нужно знать размер данных, которые были отправлены мне после того, как это было сделано.
Предыстория:Мне нужна эта информация, потому что я хотел бы сравнить ее с размером ответа, который был отправлен с использованием кодировки gzip.
Решение
Я бы использовал commons-подсчет ввода-вывода во входном потоке, который сделал бы эту работу за вас.Полный, но тривиальный пример:
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
с помощью одного из них и используйте оболочку вместо исходного потока.Когда вы закончите, вы можете запросить у wrapper его счетчик.
Другими ("ручными") подходами было бы использование такого инструмента, как YSlow, для сбора статистики в браузере или Wireshark для анализа трафика в сети.