J'essaie d'envoyer une demande de publication à une URL en utilisant HttpURLConnection (pour utiliser cUrl en java). Le contenu de la demande est xml et au point final, l'application traite le xml et stocke un enregistrement dans la base de données, puis renvoie une réponse sous forme de chaîne xml. L'application est hébergée localement sur apache-tomcat.
Lorsque j'exécute ce code à partir du terminal, une ligne est ajoutée à la base de données comme prévu. Mais une exception est levée comme suit lors de l'obtention du 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(String [] 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");
String xml = ReadWriteTextFile.getContents(xmlFile);
con.getOutputStream().write(xml.getBytes("UTF-8"));
InputStream response = con.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(response));
for (String 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 tracée jusqu'à la ligne InputStream response = con.getInputStream();
et il ne semble pas y avoir de fichier impliqué pour une FileNotFoundException.
Lorsque j'essaye d'ouvrir directement une connexion à un fichier xml, cela ne lève pas cette exception.
L'application de service utilise Spring Framework et Jaxb2Marshaller pour créer la réponse xml.
La classe ReadWriteTextFile est tirée d' ici
Merci.
Edit: Eh bien, il enregistre les données dans le DB et renvoie un code d'état de réponse 404 en même temps.
J'ai également essayé de faire une boucle en utilisant php et d'imprimer le CURLINFO_HTTP_CODE
qui s'avère être 200.
Des idées sur la façon de déboguer cela? Le service et le client se trouvent sur le serveur local.
Résolu: je pourrais résoudre le problème après avoir fait référence à une réponse sur SO lui-même.
Il semble que HttpURLConnection renvoie toujours une 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","*/*");
Réponses:
Je ne connais pas votre combinaison Spring / JAXB, mais le service Web REST moyen ne retournera pas de corps de réponse sur POST / PUT, juste un état de réponse . Vous aimeriez le déterminer au lieu du corps.
Remplacer
par
Tous les codes d'état disponibles et leur signification sont disponibles dans la spécification HTTP, comme précédemment lié. Le service Web 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 l'état commence par
4nn
ou5nn
, vous souhaitez l'utiliser à lagetErrorStream()
place pour lire le corps de la réponse qui peut contenir les détails de l'erreur.la source
getErrorStream()
comme suggéré. Il lève une NullPointerException surnew InputStreamReader(con.getErrorStream())
.URLConnection
problématique. Je me demande pourquoi les gars de Java n'ont pas simplement misgetInputStream()
en œuvre dansHttpUrlConnection
le sens dereturn responseCode == 200 ? super.getInputStream() : this.getErrorStream()
. Mais de toute façon; réponse informative, +1.FileNotFound
est juste une exception malheureuse utilisée pour indiquer que le serveur Web a renvoyé un 404.la source
getResponseCode()
avant d'appelergetInputStream()
.Pour toute personne ayant ce problème à l'avenir, la raison en est que le code d'état était un 404 (ou dans mon cas était un 500). Il semble que la
InpuStream
fonction génère une erreur lorsque le code d'état n'est pas 200.Dans mon cas, je contrôle mon propre serveur et je renvoie un code d'état 500 pour indiquer qu'une erreur s'est produite. Bien que j'envoie également un corps avec un message de chaîne détaillant l'erreur, le message a généré
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 quelle que soit la réponse d'erreur de chaîne.
la source
Pour quiconque a trébuché là-dessus, 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 mauvais ordre dans le code, j'ai d'abord demandé le flux d'entrée avant d'envoyer le corps XML. Dans le code extrait ci-dessous, la ligne
InputStream in = conn.getInputStream();
est venue immédiatement aprèsByteArrayOutputStream out = new ByteArrayOutputStream();
ce qui est le mauvais ordre des choses.FileNotFound
dans ce cas, c'était une manière malheureuse d'encoder le code de réponse HTTP 400.la source
new ByteArrayOutputStream()
n'a absolument rien à voir avec cela. Le problème est l'ordre entregetInputStream()
etgetResponseCode()
.FileNotFound dans ce cas signifie que vous avez obtenu un 404 de votre serveur - est-ce que le serveur n'aime pas les requêtes "POST"?
la source
La solution:
changez simplement localhost pour l' IP de votre PC
si vous voulez savoir ceci: Windows + r> cmd>
exemple ipconfig : http: // 192.168.0.107 /directory/service/program.php?action=send Quelque chose
remplace juste 192.168 .0.107 pour votre propre IP (n'essayez pas 127.0.0.1 car c'est la même chose que localhost )
la source
S'il vous plaît changer
À
la source