Saltar al contenido

Obtener el código de estado HTTP de la respuesta SOAP

Solución:

Tomado de la nota del W3C sobre SOAP (Sección 6.2)

SOAP HTTP sigue la semántica de los códigos de estado HTTP para comunicar información de estado en HTTP. Por ejemplo, un código de estado 2xx indica que la solicitud del cliente, incluido el componente SOAP, se recibió, comprendió y aceptó con éxito, etc.

En caso de un error SOAP mientras se procesa la solicitud, el servidor HTTP SOAP DEBE emitir una respuesta HTTP 500 “Internal Server Error” e incluir un mensaje SOAP en la respuesta que contenga un elemento SOAP Fault (ver sección 4.4) que indique el error de procesamiento SOAP.

Y de la documentación sobre SOAPFault en la API

Un elemento del objeto SOAPBody que contiene información de error y / o estado. Esta información puede estar relacionada con errores en el objeto SOAPMessage o con problemas que no están relacionados con el contenido del mensaje en sí.

Entonces, una posible respuesta podría ser

SoapMessage soapMessage = null;
soapMessage = MySOAPConnection.call(...);
soapMessage.getSOAPPart().getEnvelope().getBody().getFault().getFaultCode();

Algunas referencias que me ayudaron a crear esta respuesta son:

  • http://forums.devshed.com/java-help-9/java-httpstatus-code-59166.html
  • Apache Axis2 SAAP SoapConnectionImpl

La respuesta simple es que no puedes. Profundizando en el código HttpSOAPConnection, se utiliza una instancia local de un objeto HttpURLConnection para realizar la comunicación real con el servicio de destino. Esto obtiene el código httpResponse pero lo oculta más o menos completamente a la persona que llama. Todo lo que concluye es que si no obtiene una excepción pero el SOAPMessage devuelto contiene un SOAPFault, entonces el código de retorno fue HttpURLConnection.HTTP_INTERNAL_ERROR (es decir, 500). Sin excepción y sin SOAPFault significa que el código de retorno fue de 200 a 206, todos los cuales son “SUCCESS”; desafortunadamente, la entrada de estado de los encabezados HTTP en el objeto HttpURLConnection no se copia explícitamente en los MIMEHeaders en el SOAPMessage devuelto …

// Header field 0 is the status line so we skip it.

Cualquier otra cosa generará una excepción y el código comenzará después del corchete abierto en el campo de mensaje de la excepción y probablemente tenga tres dígitos, es difícil ser preciso porque alguien olvidó el corchete cerrado o cualquier otro separador antes del mensaje …

throw new SOAPExceptionImpl(
                    "Bad response: ("
                        + responseCode
                        + httpConnection.getResponseMessage());

Por ejemplo:

com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (502internal error - server connection terminated

Es horrible depender del formato de un mensaje de texto en una excepción, pero el código de respuesta no se expone en ningún otro lugar.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *