【问题标题】:HttpUrlConnection gets response body on connect()HttpUrlConnection 在 connect() 上获取响应正文
【发布时间】:2018-07-18 17:32:52
【问题描述】:

考虑下面的代码。

try {
    httpURLConnection = (HttpURLConnection) new URL(strings[0]).openConnection();

    httpURLConnection.setConnectTimeout(Config.HTTP_CONNECTION_TIMEOUT);
    httpURLConnection.setReadTimeout(Config.HTTP_CONNECTION_TIMEOUT);

    httpURLConnection.connect();

    responseCode = httpURLConnection.getResponseCode();
    httpURLConnection.getHeaderFields();
}
finally {
    httpURLConnection.disconnect();
}

问题是即使我不使用InputStream 来读取响应,在我的 Internet/Wifi 连接日志中我也可以看到响应正文。我想要的只是检查标题中的一个字段,并根据该字段继续阅读InputStream

我的问题是:

  1. 即使在创建和读取BufferedInputStream 之前,连接的流自动下载全部/部分文件的行为是否正确?
  2. 如果是,那么是否可以在使用InputStream 读取响应之前停止文件下载?
  3. 如果没有,那是不是我做错了什么或遗漏了什么?

【问题讨论】:

  • 你能描述一下你想要达到的目标吗?
  • @VivekMishra 当然我只想在Last-Modified 的时间晚于我上次下载的时间时下载任何响应正文。部分网站不支持If-Modified-Since

标签: java android inputstream httpurlconnection bufferedinputstream


【解决方案1】:
  1. 响应包括标头和正文,服务器不会停止客户端在发送正文之前确认标头。
    在客户端能够从标头中读取响应代码时,已经发送了正文的一部分,其大小取决于网络延迟、缓冲......
    HttpURLConnection.getResponseCode()的当前实现甚至使用getInputStream()来确保连接处于正确的状态。

  2. 客户端可以选择忽略正文,但通常不建议这样做,因为它可能会阻止持久连接被重用。
    我不确定 Android,但从 Java 6 开始,后台线程会自动用于读取剩余数据。

  3. 如果 If-Modified-Since 不是一个选项,为什么不使用 HEAD request 呢? :

HTTP HEAD 方法请求返回的标头,如果 将使用 HTTP GET 方法请求指定的资源。这样一个 可以在决定将大型资源下载到之前完成请求 例如,节省带宽。

【讨论】:

  • 服务器在发送正文之前不会停止客户端以确认标头这是一种常见做法还是标准?如果它是一个标准,你能找到一些资源吗?
  • Head Request 链接指出“对 HEAD 方法的响应不应有正文”。这是否意味着正文的发送仍然由服务器决定?
  • 不是If-Modified-Since不是一个选项,而是更多的一些服务器可能支持也可能不支持。而且我需要知道源文件是否已更改。
  • 服务器确实在等待,因为 HTTP 协议中没有任何内容,至少对于响应(与请求的 100-continue 机制相反)
  • 一个HEAD请求非常强烈地表明你对body不感兴趣,如果服务器仍然发送它,你无能为力
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
相关资源
最近更新 更多