Wie kann ich den HTTP-Status vom Ergebnis der SOAPConnection.call()
abrufen?Abrufen des HTTP-Statuscodes von der SOAP-Antwort
Antwort
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:
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
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.
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.
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();
- 1. C# Abrufen des Feldnamens von der Eigenschaft
- 2. Android: Abrufen des Kontaktnamens von der Telefonnummer
- 3. Abrufen des Profilbilds von der Google+ API
- 4. Abrufen des Klassennamens von der erweiterten Klasse
- 5. Abrufen des Anzeigenamens des Benutzers von WindowsIdentity
- 6. Abrufen des Tabellennamens von ActiveRecord
- 7. Abrufen des Benutzerkontos von ActiveDirectory
- 8. Abrufen des Kategorietextes von EventLogEntry.Category
- 9. Abrufen der Benutzerliste des Identitätsservers vom Client
- 10. Leistung. Abrufen des Dateistatus in der Sandbox
- 11. Abrufen der Befehlszeilenargumente des Python-Interpreters
- 12. Abrufen des Modellnamens aus der Modellinstanz YII
- 13. Abrufen der Fenstergröße des Öffnerfensters (IE)
- 14. Abrufen der Textansicht des TabLayout-Registers
- 15. Speichern der Stadt-ID in DB und Abrufen des Namens der Stadt beim Abrufen von Daten?
- 16. Abrufen des Dateinamens der Hochladedatei in SQL
- 17. Abrufen der Zeilennummer des Speicherorts in NSString
- 18. Abrufen des Eigenschaftsnamens des Objekts
- 19. Abrufen des Dateinamens von der URL mit Lua
- 20. Abrufen des YouTube-Videotitels von der bekannten Video-ID
- 21. Abrufen des Versionsnamens von der Google Play Developer API
- 22. Abrufen des Ergebnisarrays vor und nach der Verwendung von splice()
- 23. Abrufen des Namens der Klasse von einer Instanz
- 24. Abrufen von Datensätzen nach der aktuellen Zeitzone des Benutzers
- 25. Abrufen der Größe des Datentyps von Std :: type_info
- 26. Abrufen der Daten innerhalb des C# -Webdiensts von Jsonified Zeichenfolge
- 27. Asp.NET/VB.NET: Abrufen des Pfades von der URL/URI?
- 28. Abrufen des Remote-Sitzungsnamens von der PS-Shell-Eingabeaufforderung
- 29. Programmgesteuertes Abrufen des Webanforderungsinitiators
- 30. Abrufen des ausgewählten Elements aus der Listbox
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
Ich denke, Sie erhalten 'SOAPException' ist' http-Status unterscheidet sich von '200 OK'. – Andremoniy