2012-02-20 44 views
42

我有一個Android應用程序,與Android 2.x和3.x正常工作,但它在Android 4.x上運行時失敗。FileNotFoundException爲冰淇淋三明治HttpURLConnection

的問題是在這部分代碼:

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的運行,在一FileNotFoundExceptiongetInputStream()呼叫結果。當早期版本的Android上運行相同的二進制文件時,它會成功。這些網址在網絡瀏覽器中也可以正常使用,curl也可以。

顯然在ICS中HttpURLConnection已經發生了變化。有沒有人知道有什麼變化,和/或修補程序可能是什麼?

+1

文檔說'setDoOutput(true)'暗示'setRequestMethod(「POST」)'。你的意思是? – 2012-02-20 18:34:40

+0

它意味着做一個GET。 (我沒有編寫代碼,所以我不知道爲什麼'setDoOutput(true)'在那裏)。 – 2012-02-20 18:37:14

+0

FWIW,'setRequestMethod(「GET」)'和'setDoOutput(true)'出現在很多示例中使用'HttpURLConnection'的代碼。它在哪裏記錄它強制POST? – 2012-02-20 18:54:45

回答

93

嘗試刪除setDoOutput調用。採取從這個博客: a blog

編輯:這是使用POST調用時需要。

+1

是的,當然,刪除該行使它可以在ICS上工作,而且它似乎仍然適用於較舊的Android。 – 2012-02-20 18:52:40

+1

太棒了。它也爲我工作。 – Durai 2012-05-03 11:33:01

+3

+1000謝謝!我正在構建一個用於訪問後端的庫。我花了好幾個小時試圖弄清URLConnections爲什麼會從命令行工作,但不是當我將庫加載到我的Android項目中。 – tunneling 2013-03-10 05:04:28

5

我不知道爲什麼,但手動處理重定向可以解決問題。

connection.setInstanceFollowRedirects(false); 
26

如果服務器返回錯誤代碼(例如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... 
} 
+2

我得到的響應代碼爲500,因爲我沒有設置Content-Type,感謝您指出在這種情況下可能會拋出此異常。 – 2016-02-10 09:12:23

+1

對於任何人想知道他們爲什麼沒有「getResponseCode()」方法:只是將您的連接強制轉換爲HttpURLConnection – 2016-05-07 08:36:22

+1

有誰知道*爲什麼* Android會在代碼[拋出404錯誤時拋出FileNotFoundException](https:/ /en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error)? – 2016-07-07 05:07:24

1

有點遲了,但您也可以驗證接受的內容。您可以添加此行來接受各種內容

urlConnection.setRequestProperty("Accept","*/*"); 
相關問題