获取Java中的HTTP响应大小

时间:2009-11-04 14:35:35

标签: java http size content-length chunked-encoding

我想知道响应某个http请求发送了多少数据。 我现在所做的是:

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

//检查内容大小的响应    int feedsize = con.getContentLength();

问题是,内容-thongnth并不总是设置。例如。当服务器使用transfer-encoding = chunked时,我得到一个值-1。

需要它来显示进度信息。我只需要知道完成后发送给我的数据的大小。

背景:我需要这些信息,因为我想将它与使用gzip编码发送的响应大小进行比较。

2 个答案:

答案 0 :(得分:8)

我会使用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);
  }
}

答案 1 :(得分:2)

您可以扩展FilterInputStream,覆盖read()read(byte[],int,int)skip方法,以便在调用super表单后,更新计数器读取的字节数。

然后使用其中一个包装URLConnection返回的输入流,并使用包装器代替原始流。完成后,您可以查询包装器的计数器。

其他(“手动”)方法将使用YSlow等工具在浏览器中收集统计信息,或使用Wireshark检查网络上的流量。