21 Stimmen

FileNotFoundException beim Aufruf des Webservice

Hallo, ich habe meine anfängliche Problem . Ich bin ein totaler Android-Noob, dies ist meine erste App. Ich teste dies auf dem Android-Emulator. Ich versuche, eine Verbindung zu einem .NET-Webservice unter http://192.168.3.47/service.asmx . Ich bekomme eine FileNotFoundException . Aber sie ist da, die Url ist korrekt. Wie kann ich ihn dazu bringen, das zu sehen?

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)

Dies geschieht hier: 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();

62voto

Dan Dyer Punkte 52915

El HttpURLConnection Klasse ist insofern irreführend, als sie eine FileNotFoundException für jeden HTTP-Fehlercode von 400 oder höher.

Es muss sich also nicht unbedingt um eine falsche URL (404) handeln, sondern kann auch 400 (schlechte Anfrage), 403 (verboten), 500 (interner Serverfehler) oder etwas anderes sein.

を使用します。 [getResponseCode](http://developer.android.com/reference/java/net/HttpURLConnection.html#getResponseCode()) Methode, um einen genaueren Hinweis auf das Problem zu erhalten.

16voto

gpiazzese Punkte 415

Das ist das gleiche Problem, das ich auch hatte: HttpUrlConnection gibt FileNotFoundException zurück, wenn Sie versuchen, die getInputStream() von der Verbindung zu lesen.
Sie sollten stattdessen getErrorStream() verwenden, wenn der Statuscode höher als 400 ist.

Darüber hinaus sollten Sie vorsichtig sein, denn nicht nur 200 ist ein Erfolgsstatus, auch 201, 204 usw. werden oft als Erfolgsstatus verwendet.

Hier ist ein Beispiel dafür, wie ich es geschafft habe

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

Auf diese Weise können Sie sowohl im Erfolgs- als auch im Fehlerfall die gewünschte Antwort erhalten.

Ich hoffe, das hilft!

4voto

user1341056 Punkte 41

Versuchen Sie zu entfernen:

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

2voto

jmj Punkte 232204

Vergewissern Sie sich, dass Sie diese URL über Ihren Webbrowser aufrufen können http://192.168.3.47/service.asmx

und vergewissern Sie sich, dass in Ihrem Webbrowser kein Proxy konfiguriert ist; falls doch, konfigurieren Sie Ihren Code entsprechend

0voto

Yogesh Umesh Vaity Punkte 26562

Ich hatte diesen Fehler beim Aufrufen der API. Ich habe festgestellt, dass mir der API-Schlüssel fehlt. Jeder, der diesen Thread wegen desselben Problems findet, sollte nicht vergessen, den API-Schlüssel in den API-Aufruf aufzunehmen, wenn er von der API verlangt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X