web-dev-qa-db-fra.com

Obtenir le code de statut HTTP à partir du SOAP réponse

Comment puis-je obtenir le statut HTTP à partir du résultat de la fonction SOAPConnection.call()?

8
asthiwanka

Tiré de Note du W3C sur SOAP (chapitre 6.2)

SOAP HTTP suit la sémantique des codes d'état HTTP pour la communication d'informations d'état dans HTTP. Par exemple, un code d'état 2xx indique que la demande du client, y compris le composant SOAP, a été reçue, comprise et acceptée, etc.

En cas d'erreur SOAP lors du traitement de la demande, le serveur HTTP SOAP DOIT envoyer une réponse "Erreur de serveur interne" HTTP 500 et inclure un message SOAP dans la réponse contenant un élément SOAP Fault (voir la section 4.4) indiquant l'erreur de traitement SOAP.

Et de documentation sur SOAPFault dans l'API

Un élément dans l'objet SOAPBody qui contient des informations d'erreur et/ou d'état . Ces informations peuvent être liées à des erreurs dans l'objet SOAPMessage ou à des problèmes non liés au contenu du message.

Donc, une réponse possible pourrait être

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

Quelques références qui m'ont aidé à créer cette réponse sont:

9
PCoder

La réponse simple est que vous ne pouvez pas. En fouillant dans le code HttpSOAPConnection , une instance locale d'un objet HttpURLConnection est utilisée pour établir la communication réelle avec le service cible. Cela obtient le code httpResponse mais il le cache plus ou moins complètement de l'appelant. Tout ce que vous concluez, c'est que si vous n'obtenez pas d'exception mais que le message SOAPMessage renvoyé contient un paramètre SOAPFault, le code de retour est alors HttpURLConnection.HTTP_INTERNAL_ERROR (c'est-à-dire 500). Aucune exception et aucune erreur SOAPFault ne signifie que le code de retour était compris entre 200 et 206, tous correspondant à "SUCCESS". Malheureusement, l'entrée d'état à partir des en-têtes HTTP de l'objet HttpURLConnection n'est pas explicitement copiée dans les MIMEHeaders dans le SOAPMessage renvoyé ...

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

Tout le reste soulèvera une exception et le code commencera après la parenthèse ouverte dans le champ de message de l'exception et sera probablement de trois chiffres, il est difficile d'être précis car quelqu'un a oublié la parenthèse proche ou tout autre séparateur avant le message ...

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

Par exemple:

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

Il est horrible de s’appuyer sur le formatage d’un message texte dans une exception, mais le code de réponse n’est exposé nulle part ailleurs.

4
Jeremy Gosling

Vous pouvez accéder aux en-têtes HTTP via l'interface MessageContext.

http://docs.Oracle.com/javaee/5/api/javax/xml/ws/handler/MessageContext.html

La solution la plus simple consiste probablement à implémenter un SOAPHandler qui vous donnera accès au MessageContext:

http://docs.Oracle.com/cd/E15051_01/wls/docs103/webserv_adv/handlers.html#wp222394

Cependant, les applications SOAP ne sont généralement pas supposées créer l'interaction sur les codes d'état HTTP, car ils sont spécifiques au transport.

1
Olof Åkesson

J'ai des exigences similaires à cette question. Les analystes métier souhaitent consigner chaque code de réponse http associé à chaque appel SOAP entrant et sortant. Ma réponse est valable pour Apache CXF 2.7.5.

Vous pouvez accéder au code d'état http via l'interface MessageContext à l'aide du fragment de code ci-dessous dans une implémentation de l'interface javax.xml.ws.handler.soap.SoapHandler.

int status = (( javax.servlet.http.HttpServletResponse)messageContext.get("HTTP.RESPONSE")).getStatus();
0
Gursel Koca