【问题标题】:HttpURLConnection: What's the deal with having to read the whole response?HttpURLConnection:必须阅读整个响应有什么关系?
【发布时间】:2011-02-17 01:58:27
【问题描述】:

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

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

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

那么,如果将 http.keepAlive 设置为 false 可以解决问题,那么它究竟表明了什么?服务器以违反 http 协议的方式响应?或者更有可能,我的代码在某种程度上违反了协议?痕迹会告诉我什么?我应该寻找什么?

这是怎么回事:

你需要从错误中读取所有内容 溪流。否则,它会 混淆下一个连接,这就是 -1 的原因。

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

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

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

PS 如果我只是使用 Apache HttpClient,我是否不必处理所有这些协议细节?它会为我处理好一切吗?

【问题讨论】:

    标签: java android httpurlconnection


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢。你用这个禁用它,对吧? System.setProperty("http.keepAlive", "false")。此外,为了稳健,是否值得为所有非 200 响应实施您的代码示例?
    • 当然,您应该始终阅读所有回复。它可能包含有价值的错误消息。
    【解决方案2】:

    我认为您可能正在谈论这个 HttpURLConnection 错误,已在 froyo 中修复:

    http://code.google.com/p/android/issues/detail?id=2939

    查看该错误以了解其他解决方法。如果这不是您遇到的错误,请在http://code.google.com/p/android/issues/entry 提出带有可重复测试用例的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      相关资源
      最近更新 更多