2013-04-01 17 views
6

Come posso ottenere lo stato HTTP dal risultato dello SOAPConnection.call()?Come ottenere il codice di stato HTTP dalla risposta SOAP

+0

javax.xml.soap.SOAPConnection ha questo metodo chiamato "call()" e restituisce un SOAPMesage. Un messaggio SOAP può avere varie risposte. Ad esempio un messaggio con HTTP 200, HTTP 500, ecc. Ho bisogno di capire il codice HTTP dal detto SOAPMessage. – asthiwanka

+0

Penso che, riceverai 'SOAPException' è' http status' sarà diverso da '200 OK'. – Andremoniy

risposta

8

Tratto da W3C note on SOAP (Section 6.2)

SOAP HTTP segue la semantica dei codici di stato HTTP per comunicare le informazioni sullo stato in HTTP. Ad esempio, un codice di stato 2xx indica che la richiesta del cliente inclusa la componente SOAP è stato ricevuto con successo, compreso e accettato ecc

In caso di un errore SOAP durante l'elaborazione della richiesta, il server HTTP SOAP deve emettere una risposta HTTP 500 "Errore interno del server" e includono un messaggio SOAP nella risposta contenente un elemento di errore SOAP (vedere la sezione 4.4) che indica l'errore di elaborazione SOAP.

E da documentation on SOAPFault in the API

Un elemento nell'oggetto SOAPBody che contiene di errore e/o lo stato informazioni. Queste informazioni possono riguardare errori nell'oggetto SOAPMessage o problemi non correlati al contenuto nel messaggio stesso.

Quindi, una possibile risposta potrebbe essere

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

Alcuni riferimenti che mi ha aiutato a creare questa risposta sono:

+1

Sì. Ma che cosa è "soapMessage.getSOAPPart(). GetEnvelope(). GetBody(). GetFault(). GetFaultCode()" fa sta dando il codice di errore che è nella risposta SOAP. Sebbene le intestazioni HTTP non siano all'interno della stessa risposta SOAP. Quindi, utilizzando questo metodo, il codice di stato HTTP non può essere estratto, non è vero? – asthiwanka

1

Si può ge t accedere alle intestazioni HTTP attraverso l'interfaccia MessageContext.

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

La via da seguire più diritta è probabilmente quello di realizzare un SOAPHandler che vi darà accesso al MessageContext:

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

Tuttavia, le applicazioni SOAP non sono generalmente tenuti a costruire l'interazione sui codici di stato HTTP come quelli sono specifici del trasporto.

4

La semplice risposta è che non è possibile. Scavando nel codice HttpSOAPConnection, un'istanza locale di un oggetto HttpURLConnection viene utilizzata per eseguire la comunicazione effettiva con il servizio di destinazione. Questo ottiene il codice httpResponse ma lo nasconde più o meno completamente dal chiamante. Tutto quello che si conclude è che se non si ottiene un'eccezione ma il SOAPMessage restituito contiene un SOAPFault, il codice di ritorno era HttpURLConnection.HTTP_INTERNAL_ERROR (cioè 500). Nessuna eccezione e nessun SOAPFault significa che il codice di ritorno era compreso tra 200 e 206, che sono tutti "SUCCESSO" - sfortunatamente la voce di stato dalle intestazioni HTTP nell'oggetto HttpURLConnection non è esplicitamente copiata nelle MIMEHeaders nel SOAPMessage restituito ...

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

Tutto il resto solleverà un'eccezione e il codice inizierà dopo la parentesi aperta nel campo del messaggio di eccezione ed è probabilmente tre cifre, è difficile essere precisi, perché qualcuno ha dimenticato la stretta staffa o di qualsiasi altro separatore prima che il messaggio ...

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

Ad esempio:

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

è orribile basandosi sulla formattazione di un messaggio di testo in un'eccezione, b il codice di risposta non è esposto altrove.

0

Ho una richiesta simile a questa domanda, analista di business desidera registrare ogni codice di risposta http relativo a tutte le chiamate di sapone in entrata e in uscita. La mia risposta è valida per Apache CXF 2.7.5.

È possibile accedere al codice di stato http tramite l'interfaccia MessageContext dal frammento di codice seguente in un'implementazione dell'interfaccia javax.xml.ws.handler.soap.SoapHandler.

int status = ((javax.servlet.http.HttpServletResponse)messageContext.get("HTTP.RESPONSE")).getStatus(); 
Problemi correlati