HttpUrlConnection在connect()上获取响应主体

时间:2018-02-08 08:09:38

标签: java android inputstream httpurlconnection bufferedinputstream

请考虑以下代码。

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来阅读回复,在我的互联网/ Wifi连接日志中,我可以看到响应体。我想要的只是检查标题中的字段并根据该字段继续阅读InputStream

我的问题是这些:

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

1 个答案:

答案 0 :(得分:1)

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

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

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

  4.   

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