2013-04-01 6 views
6

Wie kann ich den HTTP-Status vom Ergebnis der SOAPConnection.call() abrufen?Abrufen des HTTP-Statuscodes von der SOAP-Antwort

+0

Die Klasse javax.xml.soap.SOAPConnection hat diese Methode namens "call()" und gibt eine SOAPMesage zurück. Eine SOAPMessage kann verschiedene Antworten haben. Zum Beispiel eine Nachricht mit HTTP 200, HTTP 500, etc. Ich muss den HTTP-Code aus der besagten SOAPMessage herausfinden. – asthiwanka

+0

Ich denke, Sie erhalten 'SOAPException' ist' http-Status unterscheidet sich von '200 OK'. – Andremoniy

Antwort

8

Entnommen W3C note on SOAP (Section 6.2)

SOAP HTTP folgt die Semantik des HTTP-Statuscodes für Statusinformationen in HTTP zu kommunizieren. Zum Beispiel zeigt ein 2xx Status Code, dass die Anforderung des Clients einschließlich der SOAP-Komponente erfolgreich empfangen wurde, verstanden und usw.

Im Falle eines SOAP-Fehler akzeptiert, während der Verarbeitung der Anforderung, muss der SOAP HTTP Server ausgeben Eine HTTP 500-Antwort "Interner Serverfehler" und enthalten eine SOAP-Nachricht in der Antwort, die ein SOAP-Fehlerelement (siehe Abschnitt 4.4) enthält, das den SOAP-Verarbeitungsfehler angibt.

Und von documentation on SOAPFault in the API

Ein Element in dem Objekt, das SOAPBody Fehler- und/oder Statusinformationen enthält. Diese Information kann sich auf Fehler im Objekt SOAPMessage oder auf Probleme beziehen, die nicht mit dem Inhalt der Nachricht selbst zusammenhängen.

So eine mögliche Antwort

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

Einige Referenzen sein könnte, die mir diese Antwort dazu beigetragen sind:

+1

Ja. Aber was 'soapMessage.getSOAPPart(). GetEnvelope(). GetBody(). GetFault(). GetFaultCode()' gibt den Fehlercode, der in der SOAP-Antwort ist. Obwohl die HTTP-Header nicht in der SOAP-Antwort selbst enthalten sind. Mit dieser Methode kann der HTTP-Statuscode nicht extrahiert werden, oder? – asthiwanka

1

Sie können ge t Zugriff auf die HTTP-Header über die MessageContext-Schnittstelle.

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

Der direkteste Weg ist wahrscheinlich einen SOAPHandler implementieren, die Sie zum Message Zugang geben: http://docs.oracle.com/cd/E15051_01/wls/docs103/webserv_adv/handlers.html#wp222394

jedoch SOAP-Anwendungen sind in der Regel nicht die Interaktion aufbauen soll

auf den HTTP-Statuscodes, da diese transportspezifisch sind.

4

Die einfache Antwort ist, dass Sie nicht können. Im Code HttpSOAPConnection wird eine lokale Instanz eines HttpURLConnection-Objekts für die eigentliche Kommunikation mit dem Zieldienst verwendet. Dies ruft zwar den httpResponse-Code ab, verbirgt ihn jedoch mehr oder weniger vollständig vor dem Aufrufer. Wenn Sie keine Ausnahme erhalten, aber die zurückgegebene SOAPMessage einen SOAPFault enthält, lautet der Rückgabecode HttpURLConnection.HTTP_INTERNAL_ERROR (d. H. 500). Keine Ausnahme und kein SOAPFault bedeutet, dass der Rückgabecode 200 bis 206 war, die alle "ERFOLGREICH" sind - leider wird der Statuseintrag von den HTTP-Headern im HttpURLConnection-Objekt explizit nicht in die MIMEHeaders in der zurückgegebenen SOAPMessage kopiert ...

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

Alles andere eine Ausnahme ausgelöst wird und der Code wird nach der offenen Klammer in dem Nachrichtenfeld der Ausnahme und ist wahrscheinlich drei Ziffern beginnen, ist es schwer, genau zu sein, weil jemand die enge Klammer oder einem anderen Separator vergessen ... bevor die Nachricht

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

zum Beispiel:

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

Es ist schrecklich auf der Formatierung einer Textnachricht in einer Ausnahme verlassen, b Der Antwortcode wird nirgendwo anders angezeigt.

0

Ich habe ähnliche Anforderungen wie diese Frage, Business Analyst jeden HTTP-Antwort-Code für jeden eingehenden und ausgehenden Soap-Anrufe zu protokollieren .. Meine Antwort gilt für Apache CXF 2.7.5.

Sie können über das folgende Codefragment in einer Implementierung der Oberfläche javax.xml.ws.handler.soap.SoapHandler auf den HTTP-Statuscode über die MessageContext-Schnittstelle zugreifen.

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