2011-03-03 178 views
19

你好我過去我最初problem。我是一個完全的android noob,這是我的第一個應用程序。我正在Android模擬器上測試這個。我嘗試連接到一個.NET web服務http://192.168.3.47/service.asmx。 我收到FileNotFoundException。但它在那裏,網址是正確的。我怎麼能讓他看到?FileNotFoundException異常時調用webservice的


03-03 11:23:49.741: WARN/System.err(455): java.io.FileNotFoundException: http://192.168.3.47/service.asmx 
03-03 11:23:49.751: WARN/System.err(455):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:521) 
03-03 11:23:49.801: WARN/System.err(455):  at gyozo.HelloWorld.HelloActivity.onClick(HelloActivity.java:62) 
03-03 11:23:49.831: WARN/System.err(455):  at android.view.View.performClick(View.java:2485) 
03-03 11:23:49.851: WARN/System.err(455):  at android.view.View$PerformClick.run(View.java:9080) 
03-03 11:23:49.871: WARN/System.err(455):  at android.os.Handler.handleCallback(Handler.java:587) 
03-03 11:23:49.910: WARN/System.err(455):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-03 11:23:49.940: WARN/System.err(455):  at android.os.Looper.loop(Looper.java:123) 
03-03 11:23:49.950: WARN/System.err(455):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-03 11:23:50.010: WARN/System.err(455):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-03 11:23:50.050: WARN/System.err(455):  at java.lang.reflect.Method.invoke(Method.java:507) 
03-03 11:23:50.070: WARN/System.err(455):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-03 11:23:50.090: WARN/System.err(455):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-03 11:23:50.110: WARN/System.err(455):  at dalvik.system.NativeStart.main(Native Method) 

這發生在這裏:InputStream is = connection.getInputStream();


URL url = new URL("http://192.168.3.47/service.asmx"); 
HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
connection.setRequestMethod("POST"); 
connection.setRequestProperty("Content-Type", 
"application/soap+xml; charset=utf-8"); 

connection.setUseCaches(false); 
connection.setDoInput(true); 
connection.setDoOutput(true); 

String soapRequest = String.format(getText(R.string.ws_listemain_ds_new).toString(), city, keyword); 
connection.setRequestProperty("Content-Length", Integer.toString(soapRequest.getBytes("UTF-8").length)); 
//Send request 
OutputStreamWriter owr = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); 

owr.write(soapRequest); 
owr.flush(); 
owr.close(); 

//Get Response 
InputStream is = connection.getInputStream(); 

回答

56

HttpURLConnection類是誤導的,因爲它會拋出一個FileNotFoundException的任何HTTP錯誤代碼爲400或更高。

所以它不一定是一個不正確的URL(404),也可能是400(錯誤的請求),403(禁止),500(內部服務器錯誤),或別的東西。

使用getResponseCode方法來獲取問題的更精確指示。

+0

任何理由如果響應代碼實際上是400,我會得到這個錯誤?這麼奇怪! – 2011-03-08 16:16:08

+0

HTTP錯誤代碼400是「錯誤的請求」。HttpURLConnection將爲400或更高版本引發FileNotFoundException。 – 2011-03-08 16:23:24

+5

很好的回答。另外,如果你得到400或更高,並且服務器也發送一個正文給響應,你可以用'conn.getErrorStream()'方法得到它。 – 2013-08-09 16:32:00

2

確保您可以從您的網絡瀏覽器http://192.168.3.47/service.asmx

訪問此網址,並確保沒有使用Web瀏覽器配置代理服務器,如果是這樣配置您的代碼相應

+0

我確定。我可以從android的web瀏覽器訪問網址。我忘了提及它來自仿真器。模擬器是否使用代理?我在哪裏檢查? – 2011-03-03 09:54:06

+1

'並確保沒有使用您的網絡瀏覽器配置代理? – 2011-03-03 09:55:30

+0

我在代理的模擬器中找不到任何東西,主機不使用代理。 – 2011-03-03 10:02:11

2

嘗試刪除:

connection.setDoInput(true); 
connection.setDoOutput(true); 
+0

我在上面添加了兩行,並且已經解決了移動數據。 – 2016-11-20 07:03:10

14

這是我有同樣的問題: HttpURLConnection的返回FileNotFoundException異常,如果你試圖從連接讀取的getInputStream()。
您應該改用getErrorStream()時的狀態代碼高於400

比這更多,請小心,因爲它不僅是200是成功狀態碼,甚至201,204,等往往用作成功狀態。

下面是我如何去管理它

... connection code code code ... 

// Get the response code 
int statusCode = connection.getResponseCode(); 

InputStream is = null; 

if (statusCode >= 200 && statusCode < 400) { 
    // Create an InputStream in order to extract the response object 
    is = connection.getInputStream(); 
} 
else { 
    is = connection.getErrorStream(); 
} 

... callback/response to your handler.... 

這樣一個例子,你將能夠獲得成功和錯誤的情況下所需要的響應。

希望這有助於!

+1

完美答案+1 – 2016-05-09 15:08:27

0

我同時調用API有這個錯誤。我意識到我錯過了API密鑰。任何發現此線程的人都會遇到同樣的問題,如果API需要,請不要忘記將API密鑰包含在API調用中。

相關問題