FileNotFoundException lors de l’obtention de l’object InputStream à partir de HttpURLConnection

J’essaie d’envoyer une demande post à une URL en utilisant HttpURLConnection (pour utiliser cUrl dans java). Le contenu de la requête est xml et, au point final, l’application traite le fichier XML et stocke un enregistrement dans la firebase database, puis renvoie une réponse sous la forme d’une chaîne xml. L’application est hébergée sur apache-tomcat localement.

Lorsque j’exécute ce code à partir du terminal, une ligne est ajoutée à la firebase database comme prévu. Mais une exception est levée comme suit lors de l’obtention du stream InputStream à partir de la connexion

java.io.FileNotFoundException: http://localhost:8080/myapp/service/generate at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1401) at org.kodeplay.helloworld.HttpCurl.main(HttpCurl.java:30) 

Voici le code

 public class HttpCurl { public static void main(Ssortingng [] args) { HttpURLConnection con; try { con = (HttpURLConnection) new URL("http://localhost:8080/myapp/service/generate").openConnection(); con.setRequestMethod("POST"); con.setDoOutput(true); con.setDoInput(true); File xmlFile = new File("test.xml"); Ssortingng xml = ReadWriteTextFile.getContents(xmlFile); con.getOutputStream().write(xml.getBytes("UTF-8")); InputStream response = con.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(response)); for (Ssortingng line ; (line = reader.readLine()) != null;) { System.out.println(line); } reader.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 

C’est déroutant car l’exception est InputStream response = con.getInputStream(); à la ligne InputStream response = con.getInputStream(); et il ne semble pas y avoir de fichier impliqué pour une exception FileNotFoundException.

Lorsque j’essaie d’ouvrir une connexion à un fichier xml directement, il ne lance pas cette exception.

L’application de service utilise le framework Spring et Jaxb2Marshaller pour créer la réponse XML.

La classe ReadWriteTextFile est extraite d’ ici

Merci.

Edit: Eh bien, il enregistre les données dans la firebase database et renvoie un code d’état de réponse 404 en même temps.

J’ai aussi essayé de faire un curl en utilisant PHP et d’imprimer le CURLINFO_HTTP_CODE qui s’avère être 200.

Des idées sur la façon dont je vais déboguer cela? Le service et le client sont tous deux sur le serveur local.

Résolu: Je pourrais résoudre le problème en me référant à une réponse sur SO lui-même.

Il semble que HttpURLConnection renvoie toujours la réponse 404 lors de la connexion à une URL avec un port non standard.

L’ajout de ces lignes l’a résolu

 con.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) "); con.setRequestProperty("Accept","*/*"); 

Je ne connais pas votre combinaison Spring / JAXB, mais le service Web REST moyen ne renverra pas de corps de réponse sur POST / PUT, juste un statut de réponse . Vous souhaitez le déterminer à la place du corps.

Remplacer

 InputStream response = con.getInputStream(); 

par

 int status = con.getResponseCode(); 

Tous les codes d’état disponibles et leur signification sont disponibles dans la spécification HTTP, comme précédemment liée. Le webservice lui-même devrait également être accompagné d’une documentation qui présente tous les codes d’état pris en charge par le service Web et leur signification particulière, le cas échéant.

Si le statut commence par 4nn ou 5nn , vous souhaitez utiliser getErrorStream() pour lire le corps de la réponse qui peut contenir les détails de l’erreur.

 InputStream error = con.getErrorStream(); 

FileNotFound est juste une exception malheureuse utilisée pour indiquer que le serveur Web a renvoyé un 404.

Pour quiconque a ce problème à l’avenir, la raison est que le code d’état était un 404 (ou dans mon cas était un 500). Il semble que la fonction InpuStream une erreur lorsque le code d’état n’est pas 200.

Dans mon cas, je contrôle mon propre serveur et renvoyais un code de statut 500 pour indiquer une erreur. Bien que j’envoie également un corps avec un message de chaîne détaillant l’erreur, le inputstream a inputstream une erreur, indépendamment du fait que le corps soit complètement lisible.

Si vous contrôlez votre serveur, je suppose que cela peut être géré en vous envoyant un code d’état 200, puis en gérant la réponse d’erreur de chaîne.

Pour quiconque a trébuché sur ce point, la même chose m’est arrivée en essayant d’envoyer un en-tête de requête SOAP à un service SOAP. Le problème était un ordre erroné dans le code, j’ai d’abord demandé le stream d’entrée avant d’envoyer le corps XML. Dans le code ci-dessous, la ligne InputStream in = conn.getInputStream(); est venu immédiatement après ByteArrayOutputStream out = new ByteArrayOutputStream(); qui est l’ordre incorrect des choses.

 ByteArrayOutputStream out = new ByteArrayOutputStream(); // send SOAP request as part of HTTP body byte[] data = request.getHttpBody().getBytes("UTF-8"); conn.getOutputStream().write(data); if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) { Log.d(TAG, "http response code is " + conn.getResponseCode()); return null; } InputStream in = conn.getInputStream(); 

FileNotFound dans ce cas était une manière malheureuse d’encoder le code de réponse HTTP 400.

FileNotFound dans ce cas signifie que vous avez un 404 à partir de votre serveur – pourrait-il être que le serveur n’aime pas les requêtes “POST”?

La solution:
changez simplement localhost pour l’ adresse IP de votre PC
si vous voulez savoir ceci: Windows + r> cmd> ipconfig
exemple: http: // 192.168.0.107 /directory/service/program.php?action=sendSomething
il suffit de remplacer 192.168.0.107 pour votre propre adresse IP (n’essayez pas 127.0.0.1 car il est identique à localhost )

S’il vous plaît changer

 con = (HttpURLConnection) new URL("http://localhost:8080/myapp/service/generate").openConnection(); 

À

 con = (HttpURLConnection) new URL("http://YOUR_IP:8080/myapp/service/generate").openConnection();