Estoy tratando de enviar una solicitud de publicación a una URL usando HttpURLConnection (para usar cUrl en java). El contenido de la solicitud es xml y, en el punto final, la aplicación procesa el xml y almacena un registro en la base de datos y luego envía una respuesta en forma de cadena xml. La aplicación está alojada en apache-tomcat localmente.
Cuando ejecuto este código desde la terminal, se agrega una fila a la base de datos como se esperaba. Pero se lanza una excepción de la siguiente manera al obtener InputStream de la conexión
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)
Aqui esta el codigo
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 confuso porque la excepción se remonta a la línea InputStream response = con.getInputStream();
y no parece haber ningún archivo involucrado para una FileNotFoundException.
Cuando intento abrir una conexión a un archivo xml directamente, no lanza esta excepción.
La aplicación de servicio utiliza Spring Framework y Jaxb2Marshaller para crear la respuesta xml.
La clase ReadWriteTextFile se toma de aquí
Gracias.
Editar: Bueno, guarda los datos en la base de datos y envía un código de estado de respuesta 404 al mismo tiempo.
También intenté hacer un curl usando php e imprimir el CURLINFO_HTTP_CODE
que resulta ser 200.
¿Alguna idea sobre cómo puedo depurar esto? Tanto el servicio como el cliente están en el servidor local.
Resuelto: podría resolver el problema después de consultar una respuesta en el SO.
Parece que HttpURLConnection siempre devuelve una respuesta 404 cuando se conecta a una URL con un puerto no estándar.
Agregar estas líneas lo resolvió
con.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
con.setRequestProperty("Accept","*/*");