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","*/*");
Respuestas:
No sé acerca de su combinación Spring / JAXB, pero el servicio web REST promedio no devolverá un cuerpo de respuesta en POST / PUT, solo un estado de respuesta . Le gustaría determinarlo en lugar del cuerpo.
Reemplazar
por
Todos los códigos de estado disponibles y su significado están disponibles en la especificación HTTP, como se vinculó anteriormente. El servicio web en sí también debería venir junto con alguna documentación que describa todos los códigos de estado admitidos por el servicio web y su significado especial, si corresponde.
Si el estado comienza con
4nn
o5nn
, le gustaría usargetErrorStream()
en su lugar para leer el cuerpo de la respuesta que puede contener los detalles del error.fuente
getErrorStream()
como se sugiere. Lanza una NullPointerException ennew InputStreamReader(con.getErrorStream())
.URLConnection
problemáticas más genéricas . Me pregunto por qué los chicos de Java no implementaron simplementegetInputStream()
enHttpUrlConnection
la línea dereturn responseCode == 200 ? super.getInputStream() : this.getErrorStream()
. Pero de todos modos; respuesta informativa, +1.FileNotFound
es solo una desafortunada excepción que se usa para indicar que el servidor web devolvió un 404.fuente
getResponseCode()
antes de llamargetInputStream()
.Para cualquiera que tenga este problema en el futuro, la razón es porque el código de estado era 404 (o en mi caso era 500). Parece que la
InpuStream
función arrojará un error cuando el código de estado no sea 200.En mi caso, controlo mi propio servidor y estaba devolviendo un código de estado 500 para indicar que ocurrió un error. A pesar de que también envié un cuerpo con un mensaje de cadena que detalla el error,
inputstream
arrojó un error independientemente de que el cuerpo sea completamente legible.Si controla su servidor, supongo que esto se puede manejar enviándose un código de estado 200 y luego manejando la respuesta de error de cadena.
fuente
Para cualquier otra persona que se tropiece con esto, me sucedió lo mismo al intentar enviar un encabezado de solicitud SOAP a un servicio SOAP. El problema fue un orden incorrecto en el código, primero solicité el flujo de entrada antes de enviar el cuerpo XML. En el código recortado a continuación, la línea
InputStream in = conn.getInputStream();
vino inmediatamente después de laByteArrayOutputStream out = new ByteArrayOutputStream();
cual es el orden incorrecto de las cosas.FileNotFound
en este caso fue una forma desafortunada de codificar el código de respuesta HTTP 400.fuente
new ByteArrayOutputStream()
no tiene nada que ver con eso. El problema es el orden entregetInputStream()
ygetResponseCode()
.FileNotFound en este caso significa que obtuvo un 404 de su servidor. ¿Podría ser que al servidor no le gustan las solicitudes "POST"?
fuente
La solución:
simplemente cambie localhost por la IP de su PC
si desea saber esto: Windows + r> cmd> ipconfig
ejemplo: http: // 192.168.0.107 /directory/service/program.php?action=send Algo
simplemente reemplace 192.168 .0.107 para su propia IP (no intente 127.0.0.1 porque es lo mismo que localhost )
fuente
Por favor cambia
A
fuente