Sto cercando di inviare una richiesta di post a un URL utilizzando HttpURLConnection (per l'utilizzo di cUrl in java). Il contenuto della richiesta è xml e al punto finale, l'applicazione elabora l'xml e memorizza un record nel database, quindi invia una risposta sotto forma di stringa xml. L'app è ospitata localmente su apache-tomcat.
Quando eseguo questo codice dal terminale, una riga viene aggiunta al database come previsto. Ma viene generata un'eccezione come segue durante il recupero di InputStream dalla connessione
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)
Ecco il codice
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();
}
}
}
È fonte di confusione perché l'eccezione viene tracciata sulla riga InputStream response = con.getInputStream();
e non sembra esserci alcun file coinvolto per un'eccezione FileNotFoundException.
Quando provo ad aprire direttamente una connessione a un file xml, non genera questa eccezione.
L'app di servizio utilizza il framework spring e Jaxb2Marshaller per creare l'xml di risposta.
La classe ReadWriteTextFile è presa da qui
Grazie.
Modifica: salva i dati nel DB e restituisce un codice di stato della risposta 404 allo stesso tempo.
Ho anche provato a fare un curl usando php e ho stampato il CURLINFO_HTTP_CODE
che risulta essere 200.
Qualche idea su come posso eseguire il debug di questo? Sia il servizio che il client si trovano sul server locale.
Risolto: potrei risolvere il problema dopo aver fatto riferimento a una risposta su SO stesso.
Sembra che HttpURLConnection restituisca sempre la risposta 404 quando ci si connette a un URL con una porta non standard.
L'aggiunta di queste righe lo ha risolto
con.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
con.setRequestProperty("Accept","*/*");