web-dev-qa-db-fra.com

FileNotFoundException lors de l'appel de webservice

Bonjour, j'ai passé mon initial problème . Je suis un noob total Android, ceci est ma première application. Je teste cela sur l'émulateur Android. J'essaie de me connecter à un service Web .NET à http://192.168.3.47/service.asmx. Je reçois une FileNotFoundException. Mais il IS, l'URL est correcte. Comment puis-je lui faire voir ça?


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)

Cela se passe ici: 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();
20
gyozo kudor

La classe HttpURLConnection est trompeuse dans la mesure où elle lancera une FileNotFoundException pour tout code d'erreur HTTP de 400 ou plus.

Donc, ce n'est pas nécessairement une URL incorrecte (404), il peut s'agir de 400 (demande incorrecte), 403 (interdit), 500 (erreur de serveur interne) ou autre chose.

Utilisez la méthode getResponseCode pour obtenir une indication plus précise du problème.

61
Dan Dyer

C'est le même problème que j'avais: HttpUrlConnection renvoie FileNotFoundException si vous essayez de lire la méthode getInputStream ().
Vous devriez plutôt utiliser getErrorStream () lorsque le code de statut est supérieur à 400.

Mieux que cela, soyez prudent, car le code d'état de réussite n'est pas seulement 200, même les codes 201, 204, etc. sont souvent utilisés comme états de réussite.

Voici un exemple de la façon dont je suis allé le gérer 

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

De cette manière, vous pourrez obtenir la réponse nécessaire dans les cas de réussite et d'erreur. 

J'espère que cela t'aides!

16
gpiazzese

Essayez de supprimer:

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

Assurez-vous que vous pouvez accéder à cette URL à partir de votre navigateur Web http://192.168.3.47/service.asmx

et assurez-vous qu’aucun proxy n’est configuré avec votre navigateur Web; si tel est le cas, configurez votre code en conséquence

2
Jigar Joshi

J'ai eu cette erreur lors de l'appel de l'API. J'ai réalisé qu'il me manquait la clé API. Quiconque trouve ce fil pour le même problème, n'oubliez pas d'inclure la clé API dans l'appel API, si cela est requis par l'API.

0