冰淇淋三明治中 HttpURLConnection 的 FileNotFoundException

Posted

技术标签:

【中文标题】冰淇淋三明治中 HttpURLConnection 的 FileNotFoundException【英文标题】:FileNotFoundException for HttpURLConnection in Ice Cream Sandwich 【发布时间】: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),它将使用POST。 developer.android.com/reference/java/net/HttpURLConnection.html 它已经很老了,但我所做的只是我省略了 conn.setRequestMethod("GET") ,我们设置了 conn.setDoOutput(true) 这意味着它是一个 POST,反之亦然 【参考方案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","*/*");

【讨论】:

以上是关于冰淇淋三明治中 HttpURLConnection 的 FileNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章

更改冰淇淋三明治中的状态栏颜色 [重复]

从冰淇淋三明治添加应用程序功能

如何设计冰淇淋三明治标签之间的分隔线?

JNI调用坑

“清除数据”也会杀死应用程序吗?

在 Android 中使用 HTML 内容时出现 Web 视图错误