【问题标题】:FileNotFoundException for HttpURLConnection in Ice Cream Sandwich冰淇淋三明治中 HttpURLConnection 的 FileNotFoundException
【发布时间】:2012-03-11 01:42:16
【问题描述】:

我有一个 Android 应用在 Android 2.x 和 3.x 上运行良好,但在 Android 4.x 上运行时失败。

问题出在这段代码中:

URL url = new URL("http://blahblah.blah/somedata.xml");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
urlConnection.connect();

InputStream inputStream = urlConnection.getInputStream();

当应用程序在 Android 4.x 上运行时,getInputStream() 调用会生成 FileNotFoundException。当相同的二进制文件在早期版本的 Android 上运行时,它会成功。这些 URL 在 Web 浏览器和 curl 中也可以正常工作。

显然,HttpURLConnection 的某些内容在 ICS 中发生了变化。有没有人知道发生了什么变化,和/或修复可能是什么?

【问题讨论】:

  • 文档说setDoOutput(true) 暗示setRequestMethod("POST")。你是什​​么意思?
  • 这是为了做一个 GET。 (代码不是我写的,所以不知道为什么有setDoOutput(true)。)
  • FWIW、setRequestMethod("GET")setDoOutput(true) 出现在很多使用HttpURLConnection 的示例代码中。它在哪里记录它强制发布?
  • HTTP 方法 HttpURLConnection 默认使用GET 方法。如果调用了setDoOutput(true),它将使用POSTdeveloper.android.com/reference/java/net/HttpURLConnection.html
  • 它已经很老了,但我所做的只是我省略了 conn.setRequestMethod("GET") ,我们设置了 conn.setDoOutput(true) 这意味着它是一个 POST,反之亦然

标签: android httpurlconnection filenotfoundexception


【解决方案1】:

尝试删除 setDoOutput 调用。取自此博客: a blog

编辑:使用 POST 调用时需要这样做。

【讨论】:

  • 是的,果然,删除该行使其可以在 ICS 上运行,而且它似乎仍然可以在旧版 Android 上运行。
  • +1000 谢谢!我正在构建一个用于访问后端的库。我花了几个小时试图弄清楚为什么 URLConnections 可以从命令行工作,但当我将库加载到我的 Android 项目时却不行。
  • 这个答案至少为我节省了一个小时。我的第一次谷歌搜索给了我这个:)
  • 请注意,这是在发出 POST 请求时需要的!在这种情况下,它应该保持在原位。
  • 大家好。当你使用 POST 调用时,你会做什么?
【解决方案2】:

如果服务器返回错误代码(例如,400 或 401),也可能引发 FileNotFoundException。您可以按如下方式处理:

int responseCode = con.getResponseCode(); //can call this instead of con.connect()
if (responseCode >= 400 && responseCode <= 499) {
    throw new Exception("Bad authentication status: " + responseCode); //provide a more meaningful exception message
}
else {
    InputStream in = con.getInputStream();
    //etc...
}

【讨论】:

  • 我收到响应代码 500,因为我没有设置 Content-Type,感谢您指出在这些情况下可能会引发此异常。
  • 对于任何想知道为什么他们没有“getResponseCode()”方法的人:只需将您的连接转换为 HttpURLConnection
  • 有人知道为什么 Android 在代码which clearly aren't 404 上抛出 FileNotFoundException 吗?
  • @DavidLord 我有这个错误,因为我的 URL 格式不正确。我使用URLEncoder.encode(myURL, "UTF-8"); 作为包含空格字符的网址部分,一切顺利。
【解决方案3】:

我不知道为什么,但是手动处理重定向可以解决问题。

connection.setInstanceFollowRedirects(false);

【讨论】:

    【解决方案4】:

    有点晚,但您也可以验证接受的内容。您可以添加此行以接受各种内容

    urlConnection.setRequestProperty("Accept","*/*");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 2014-03-26
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      相关资源
      最近更新 更多