Ich versuche, eine Post-Anfrage mit HttpURLConnection an eine URL zu senden (für die Verwendung von cUrl in Java). Der Inhalt der Anforderung ist XML. Am Endpunkt verarbeitet die Anwendung die XML-Datei, speichert einen Datensatz in der Datenbank und sendet dann eine Antwort in Form einer XML-Zeichenfolge zurück. Die App wird lokal auf Apache-Tomcat gehostet.
Wenn ich diesen Code vom Terminal aus ausführe, wird der Datenbank erwartungsgemäß eine Zeile hinzugefügt. Beim Abrufen des InputStream von der Verbindung wird jedoch eine Ausnahme wie folgt ausgelöst
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)
Hier ist der 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();
}
}
}
Es ist verwirrend, weil die Ausnahme auf die Zeile zurückgeführt wird InputStream response = con.getInputStream();
und anscheinend keine Datei für eine FileNotFoundException beteiligt ist.
Wenn ich versuche, eine Verbindung zu einer XML-Datei direkt herzustellen, wird diese Ausnahme nicht ausgelöst.
Die Service-App verwendet Spring Framework und Jaxb2Marshaller, um die Antwort-XML zu erstellen.
Die Klasse ReadWriteTextFile wird von hier übernommen
Vielen Dank.
Bearbeiten: Nun, es speichert die Daten in der Datenbank und sendet gleichzeitig einen 404-Antwortstatuscode zurück.
Ich habe auch versucht, eine Locke mit PHP zu machen und die auszudrucken CURLINFO_HTTP_CODE
die sich als 200 herausstellt.
Irgendwelche Ideen, wie ich das debuggen soll? Sowohl der Dienst als auch der Client befinden sich auf dem lokalen Server.
Behoben: Ich konnte das Problem lösen, nachdem ich mich auf eine Antwort bezogen hatte auf SO selbst verwiesen hatte.
Es scheint, dass HttpURLConnection immer eine 404-Antwort zurückgibt, wenn eine Verbindung zu einer URL mit einem nicht standardmäßigen Port hergestellt wird.
Das Hinzufügen dieser Zeilen löste das Problem
con.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
con.setRequestProperty("Accept","*/*");