java - HttpURLConnection:必须阅读整个响应有什么关系?

标签 java android httpurlconnection

我目前的问题与this one 非常相似.

我有一个 downloadFile(URL) 函数,它创建一个新的 HttpURLConnection,打开它,读取它,返回结果。当我在同一个 URL 上多次调用此函数时,第二次几乎总是返回 -1 的响应代码(但不会抛出异常!!!)。

top answer in that question非常有帮助,但我想了解一些事情。

那么,如果将 http.keepAlive 设置为 false 可以解决问题,那么它到底说明了什么?服务器以违反 http 协议(protocol)的方式响应?或者更有可能的是,我的代码以某种方式违反了协议(protocol)?痕迹会告诉我什么?我应该寻找什么?

这是怎么回事:

You need to read everything from error stream. Otherwise, it's going to confuse next connection and that's the cause of -1.

这是否意味着如果响应是某种类型的错误(这将是什么响应代码?),则必须完全读取流?此外,每次我尝试一个 http 请求时,我基本上都是在创建一个新连接,然后在最后 disconnect() 连接它。

但是,就我而言,我没有收到 401 或其他任何内容。它始终是 200。但是我的第二个连接几乎总是失败。这是否意味着有一些我应该阅读但我没有阅读的其他数据(以类似的方式必须完全读取错误流)?

请帮忙解释一下?我觉得我缺少一些基本的 HTTP 协议(protocol)理解。

PS 如果我只使用 Apache HttpClient,我是否不必处理所有这些协议(protocol)细节?它会照顾我的一切吗?

最佳答案

在默认 HTTP URL 处理程序中对 keep-alive 的支持是非常错误的。我们总是把它关掉。

如果您想要保持 Activity 状态,请将 Apache HttpClient 与池连接管理器一起使用。如果你不想改变你的代码,你可以得到另一个像这样的处理程序,

http://www.innovation.ch/java/HTTPClient/

如果你的第二次连接总是失败,那意味着你的服务器不支持keepalive。使用 Keepalive,HTTP 处理程序只需保持连接打开(即使您调用断开连接)。如果不支持保持 Activity 状态,服务器将关闭连接,但处理程序直到您对连接发出下一个请求才知道,因此第二次连接失败。

关于读取错误流,它仅在您收到非 200 响应时适用。

关于java - HttpURLConnection:必须阅读整个响应有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2792843/

相关文章:

Java.lang.NumberFormatException错误: empty string- Java Application

java - 抛光 mongodb 查询

android - Android 中多个 fragment 之间的通信

java - URL 包含空格的 HttpURLConnection

android - 我该如何解决 - 无法解析符号执行

android - Android 应用程序中的预加载数据库损坏问题

java - 带有 FileReader 的 BufferedReader 使用大量 RAM

java - 如何从 Windows 服务调用批处理文件?

将部分记录信息保存到数据库的Android UI模式

android - 使用 phonegap 'captureVideo' 捕获视频后将视频保存到库