2011-03-03 26 views
19

Merhaba İlk problem'umu geçtim. Ben toplam android noob'um, bu benim ilk uygulamam. Bunu Android emülatöründe test ediyorum. .NET web servisine http://192.168.3.47/service.asmx adresinden bağlanmayı deniyorum. FileNotFoundException'u alırım. Ama o var, url doğru. Onu nasıl görmesini sağlayabilirim?WebService çağrılırken FileNotFoundException


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) 

Bu burada olur: 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(); 

cevap

56

HttpURLConnection sınıfınumarasını atacak şekilde yanıltıcı şekilde yapılandırıyor 400 veya üstü herhangi bir HTTP hata kodu için. Bu nedenle, yanlış bir URL (404) olması gerekmez, bu 400 (kötü istek), 403 (yasak), 500 (dahili sunucu hatası) veya başka bir şey olabilir.

Sorunun daha kesin bir şekilde belirtilmesi için getResponseCode yöntemini kullanın. çıkarmadan

+0

Yanıt kodu aslında 400 ise bu hatayı alıyorum. Çok garip! –

+0

HTTP hata kodu 400, "Kötü İstek" dir.HttpURLConnection 400 veya üstü bir FileNotFoundException atar. –

+5

Harika cevap. Ayrıca, 400 ve üstü alırsanız ve sunucu da yanıt için bir beden gönderirse, bunu 'conn.getErrorStream()' yöntemiyle alabilirsiniz. –

2

web tarayıcınızda http://192.168.3.47/service.asmx

bu URL'yi erişebilir emin olun ve eğer öyleyse, web tarayıcınız ile yapılandırılmış proxy olduğundan emin olun Kodunuzu

+0

Eminim. Android'den web tarayıcısından url'ye erişebilirim. Emülatörden bahsetmeyi unuttum. Emülatör proxy kullanıyor mu? Bunu nerede kontrol ederim? –

+1

've web tarayıcınızla yapılandırılmış bir proxy olmadığından emin olun. –

+0

Vekil sunucuda proxy'lerde hiçbir şey bulamadım, ana bilgisayar proxy kullanmıyor. –

2

Dene:

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

Yukarıdaki iki satırı ekledim ve mobil veri için çözüldü. –

14

Ben başlamıştı aynı problem: Eğer bağlantısından getInputStream() okumak için çalışırsanız HttpUrlConnection FileNotFoundException döndürür. hatta 201 başarı durum kodu, 204, vs. genellikle olmak sadece 200 beri durum kodu bu daha yüksek 400'den

Daha olduğunda
yerine getErrorStream() kullanmalısınız, lütfen dikkatli olun başarı durumları olarak kullanılır. İşte

Bu sayede o

... 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.... 

yönetmek için nasıl gittiğini örneğidir, hem başarı ve hata durumlarında ihtiyacı yanıt almak mümkün olacak.

Bu yardımcı olur umarız!

+1

Mükemmel cevap +1 –

0

API çağrısı yaparken bu hatayı aldım. API anahtarını kaçırdığımı fark ettim. Bu sorunu aynı sorunla karşılaştıran herkes, API tarafından istenirse API anahtarını API çağrısına dahil etmeyi unutmayın.

İlgili konular