冰淇淋三明治中 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的主要内容,如果未能解决你的问题,请参考以下文章