2011-03-01 35 views
8

He comenzado un pequeño proyecto en Java.
Tengo que crear un cliente que envíe xml a una url como una solicitud HTTP POST.
lo intento usando java.net.* paquete (continuación se presenta la pieza de código) pero estoy consiguiendo el error de la siguiente manera:La llamada al servicio web devuelve el error 500

java.io.IOException: Server returned HTTP response code: 500 for URL: "target url" 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441) 
    at newExample.main(newExample.java:36) 

Mi código es el siguiente:

try { 
     URL url = new URL("target url"); 

     URLConnection connection = url.openConnection(); 

     if(connection instanceof HttpURLConnection) 
      ((HttpURLConnection)connection).setRequestMethod("POST"); 

     connection.setRequestProperty("Content-Length", Integer.toString(requestXml.length())); 
     connection.setRequestProperty("Content-Type","text/xml; charset:ISO-8859-1;"); 
     connection.setDoOutput(true); 
     connection.connect();   

     // Create a writer to the url 
     PrintWriter writer = new PrintWriter(new 
     OutputStreamWriter(connection.getOutputStream())); 

     // Get a reader from the url 
     BufferedReader reader = new BufferedReader(new 
     InputStreamReader(connection.getInputStream())); 

     writer.println(); 
     writer.println(requestXml); 
     writer.println(); 
     writer.flush(); 

     String line = reader.readLine(); 
      while(line != null) { 
        System.out.println(line); 
        line = reader.readLine(); 
      } 


    } catch (MalformedURLException e) { 
        e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

favor, ayuda con ejemplos adecuados o otras formas de hacer esto.

Señale errores/errores en el código anterior u otras posibilidades.

Mi servicio Web está en el marco de primavera

XML para enviar está en el formato de cadena: requestXml

+0

El error HTTP 500 es "error interno del servidor" un error genérico devuelto cuando el servicio encuentra un error o arroja una excepción. Es posible que desee leer el cuerpo de la respuesta completa y ver si hay más información –

+0

código de error 500 es un error interno del servidor. Así que me concentraría en el servidor en lugar del cliente realmente. – sfussenegger

+0

Si su URL es correcta (puede verificar desde el navegador), no hay mucho que pueda hacer. Parece un error del servidor. – Nishant

Respuesta

3

El problema está dentro de su código de servidor o la configuración del servidor:

10.5.1 500 Error interno del servidor

El servidor encontró una condición inesperada que le impidió cumplir con el r equest.

(w3c.org/Protocols)

Si el servidor está bajo su control (debe ser, si miro la URL [antes de la edición]), a continuación, echar un vistazo a los registros del servidor.

1

Bien, debe cerrar sus flujos y conexiones. La gestión automática de recursos desde Java 7 o http://projectlombok.org/ puede ayudar. Sin embargo, este probablemente no es el problema principal.

El problema principal es que falla el servidor. El código HTTP 500 significa un error del lado del servidor. No puedo decirte el motivo, porque no conozco la parte del servidor. Tal vez deberías mirar el registro del servidor.

1

Creo que su problema es que está abriendo el flujo de entrada antes de haber escrito y cerrado el flujo de salida. Ciertamente, el Sun Tutorial lo hace de esa manera.

Si abre la secuencia de entrada demasiado pronto, es posible que la secuencia de salida se cierre automáticamente, haciendo que el servidor vea una solicitud POST vacía. Esto podría ser suficiente para confundirlo y enviar una respuesta de 500.

Incluso si esto no es lo que está causando los 500 errores, es una buena idea hacer las cosas en el orden establecido en el tutorial. Para empezar, si accidentalmente lee la respuesta antes de que haya terminado de escribir la solicitud, es probable que (al menos temporalmente) bloquee la conexión. (De hecho, parece que su código está haciendo esto porque no está cerrando el escritor antes de leerlo)

Un problema aparte es que su código no cierra la conexión en todas las circunstancias y por lo tanto es responsable para filtrar conexiones de red. Si lo hace de forma repetida, es probable que genere más IOExceptions.

21

El problema radica en el código de abajo

// Get a reader from the url 
BufferedReader reader = new BufferedReader(new 
InputStreamReader(connection.getInputStream())); 

A medida que el servicio no podría volver siempre que la respuesta correcta ... como está llamando a un servicio a través de HTTP, puede ser posible que el servidor no está disponible o el servicio no está disponible. Por lo tanto, siempre debe verificar el código de respuesta antes de leer la respuesta de las transmisiones, en función del código de respuesta, debe decidir si leerlo desde InputStream para una respuesta exitosa o de errorStream en caso de falla o condición de excepción.

BufferedReader reader = null; 

if(connection.getResponseCode() == 200) 
{ 
reader = new BufferedReader(new 
InputStreamReader(connection.getInputStream())); 
} 
else 
{ 
reader = new BufferedReader(new 
InputStreamReader(connection.getErrorStream())); 
} 

Esto resolvería el problema

+0

¡Excelente respuesta! –

0

Si está llamando a un servicio web externo y pasar un JSON en la llamada REST, comprobar el tipo de datos de los valores pasados.

Ejemplo:

{ "originalReference":"8535064088443985", 
    "modificationAmount": 
    { "amount":"16.0", 
     "currency":"AUD" 
    }, 
    "reference":"20170928113425183949", 
    "merchantAccount":"MOM1" 
} 

En este ejemplo, el valor de la cantidad fue enviado como una cadena y la llamada de servicio web con el servidor no devolvió el código de respuesta HTTP: 500. Pero cuando la cantidad: 16.0 era enviado, es decir, se pasó un entero, se realizó la llamada. Aunque ha referido la documentación de API al llamar a tales API externas, pequeños detalles como este podrían perderse.

Cuestiones relacionadas