XML -Soap
- SOAP steht für Simple Object Access Protocol _ _
- SOAP ist ein Anwendungskommunikationsprotokoll
- SOAP ist ein Format zum Senden und Empfangen von Nachrichten
- SOAP ist plattformunabhängig
- SOAP basiert auf XML
- SOAP ist eine W3C-Empfehlung
Warum Seife?
Es ist wichtig, dass Webanwendungen über das Internet kommunizieren können.
Die Kommunikation zwischen Anwendungen erfolgt am besten über HTTP, da HTTP von allen Internetbrowsern und -servern unterstützt wird. SOAP wurde geschaffen, um dies zu erreichen.
SOAP bietet eine Möglichkeit zur Kommunikation zwischen Anwendungen, die auf unterschiedlichen Betriebssystemen mit unterschiedlichen Technologien und Programmiersprachen ausgeführt werden.
SOAP-Bausteine
Eine SOAP-Nachricht ist ein gewöhnliches XML-Dokument, das die folgenden Elemente enthält:
- Ein Envelope-Element, das das XML-Dokument als SOAP-Nachricht identifiziert
- Ein Header-Element, das Header-Informationen enthält
- Ein Body-Element, das Anruf- und Antwortinformationen enthält
- Ein Fault-Element, das Fehler und Statusinformationen enthält
Alle obigen Elemente werden im Standardnamensraum für den SOAP-Umschlag deklariert:
http://www.w3.org/2003/05/soap-envelope/
und der Standard-Namespace für SOAP-Codierung und Datentypen ist:
http://www.w3.org/2003/05/soap-encoding
Syntaxregeln
Hier sind einige wichtige Syntaxregeln:
- Eine SOAP-Nachricht MUSS mit XML codiert werden
- Eine SOAP-Nachricht MUSS den SOAP Envelope-Namespace verwenden
- Eine SOAP-Nachricht darf KEINE DTD-Referenz enthalten
- Eine SOAP-Nachricht darf KEINE XML-Verarbeitungsanweisungen enthalten
Skelettierte SOAP-Nachricht
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
...
</soap:Header>
<soap:Body>
...
<soap:Fault>
...
</soap:Fault>
</soap:Body>
</soap:Envelope>
Das SOAP-Envelope-Element
Das erforderliche SOAP Envelope-Element ist das Stammelement einer SOAP-Nachricht. Dieses Element definiert das XML-Dokument als SOAP-Nachricht.
Beispiel
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
Der xmlns:soap-Namespace
Beachten Sie den Namespace xmlns:soap im obigen Beispiel. Es sollte immer den Wert "http://www.w3.org/2003/05/soap-envelope/" haben.
Der Namespace definiert den Umschlag als SOAP-Umschlag.
Wenn ein anderer Namespace verwendet wird, generiert die Anwendung einen Fehler und verwirft die Nachricht.
Das encodingStyle-Attribut
Das encodingStyle-Attribut wird verwendet, um die im Dokument verwendeten Datentypen zu definieren. Dieses Attribut kann auf jedem SOAP-Element erscheinen und gilt für den Inhalt des Elements und alle untergeordneten Elemente.
Eine SOAP-Nachricht hat keine Standardcodierung.
Syntax
soap:encodingStyle="URI"
Beispiel
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
Das SOAP-Header-Element
Das optionale SOAP-Header-Element enthält anwendungsspezifische Informationen (wie Authentifizierung, Zahlung usw.) über die SOAP-Nachricht.
Wenn das Header-Element vorhanden ist, muss es das erste untergeordnete Element des Envelope-Elements sein.
Hinweis: Alle unmittelbar untergeordneten Elemente des Header-Elements müssen Namespace-qualifiziert sein.
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
Das obige Beispiel enthält eine Kopfzeile mit einem „Trans“-Element, einem „mustUnderstand“-Attribut mit einem Wert von 1 und einem Wert von 234.
SOAP definiert drei Attribute im Standardnamensraum. Diese Attribute sind: mustUnderstand, Actor und encodingStyle.
Die im SOAP-Header definierten Attribute definieren, wie ein Empfänger die SOAP-Nachricht verarbeiten soll.
Das mustUnderstand-Attribut
Das SOAP-Attribut mustUnderstand kann verwendet werden, um anzugeben, ob ein Header-Eintrag für die Verarbeitung durch den Empfänger obligatorisch oder optional ist.
Wenn Sie einem untergeordneten Element des Header-Elements mustUnderstand="1" hinzufügen, bedeutet dies, dass der Empfänger, der den Header verarbeitet, das Element erkennen muss. Wenn der Empfänger das Element nicht erkennt, schlägt er bei der Verarbeitung des Headers fehl.
Syntax
soap:mustUnderstand="0|1"
Beispiel
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
Das Akteursattribut
Eine SOAP-Nachricht kann von einem Sender zu einem Empfänger reisen, indem sie verschiedene Endpunkte entlang des Nachrichtenpfads passiert. Allerdings sind möglicherweise nicht alle Teile einer SOAP-Nachricht für den endgültigen Endpunkt bestimmt, sondern für einen oder mehrere Endpunkte auf dem Nachrichtenpfad.
Das SOAP-Actor-Attribut wird verwendet, um das Header-Element an einen bestimmten Endpunkt zu adressieren.
Syntax
soap:actor="URI"
Beispiel
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"
soap:actor="https://www.w3schools.com/code/">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
Das encodingStyle-Attribut
Das encodingStyle-Attribut wird verwendet, um die im Dokument verwendeten Datentypen zu definieren. Dieses Attribut kann auf jedem SOAP-Element erscheinen und gilt für den Inhalt dieses Elements und alle untergeordneten Elemente.
Eine SOAP-Nachricht hat keine Standardcodierung.
Syntax
soap:encodingStyle="URI"
Das SOAP-Körperelement
Das erforderliche SOAP-Body-Element enthält die eigentliche SOAP-Nachricht, die für den endgültigen Endpunkt der Nachricht bestimmt ist.
Unmittelbar untergeordnete Elemente des SOAP-Body-Elements können Namespace-qualifiziert sein.
Beispiel
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPrice xmlns:m="https://www.w3schools.com/prices">
<m:Item>Apples</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
Das obige Beispiel fragt nach dem Preis von Äpfeln. Beachten Sie, dass die obigen m:GetPrice- und Item-Elemente anwendungsspezifische Elemente sind. Sie sind kein Teil des SOAP-Namespace.
Eine SOAP-Antwort könnte etwa so aussehen:
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPriceResponse xmlns:m="https://www.w3schools.com/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
Das SOAP-Fehlerelement
Das optionale SOAP-Fault-Element wird verwendet, um Fehlermeldungen anzuzeigen.
Das SOAP-Fault-Element enthält Fehler- und Statusinformationen für eine SOAP-Nachricht.
Wenn ein Fault-Element vorhanden ist, muss es als untergeordnetes Element des Body-Elements erscheinen. Ein Fault-Element kann in einer SOAP-Nachricht nur einmal vorkommen.
Das SOAP-Fehlerelement hat die folgenden Unterelemente:
Sub Element | Description |
---|---|
<faultcode> | A code for identifying the fault |
<faultstring> | A human readable explanation of the fault |
<faultactor> | Information about who caused the fault to happen |
<detail> |
Holds application specific error information related to the Body element |
SOAP-Fehlercodes
Die nachfolgend definierten Fehlercodewerte müssen bei der Beschreibung von Fehlern im Fehlercodeelement verwendet werden:
Error | Description |
---|---|
VersionMismatch | Found an invalid namespace for the SOAP Envelope element |
MustUnderstand | An immediate child element of the Header element, with the mustUnderstand attribute set to "1", was not understood |
Client | The message was incorrectly formed or contained incorrect information |
Server | There was a problem with the server so the message could not proceed |
Das HTTP-Protokoll
HTTP kommuniziert über TCP/IP. Ein HTTP-Client stellt über TCP eine Verbindung zu einem HTTP-Server her. Nach dem Verbindungsaufbau kann der Client eine HTTP-Request-Nachricht an den Server senden:
POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200
Der Server verarbeitet dann die Anfrage und sendet eine HTTP-Antwort zurück an den Client. Die Antwort enthält einen Statuscode, der den Status der Anfrage angibt:
200 OK
Content-Type: text/plain
Content-Length: 200
Im obigen Beispiel hat der Server den Statuscode 200 zurückgegeben. Dies ist der Standarderfolgscode für HTTP.
Wenn der Server die Anfrage nicht entschlüsseln konnte, könnte er so etwas zurückgegeben haben:
400 Bad Request
Content-Length: 0
SOAP-Bindung
Die SOAP-Spezifikation definiert die Struktur der SOAP-Nachrichten, nicht wie sie ausgetauscht werden. Diese Lücke wird durch sogenannte „SOAP Bindings“ gefüllt. SOAP-Bindungen sind Mechanismen, die den effektiven Austausch von SOAP-Nachrichten über ein Transportprotokoll ermöglichen.
Die meisten SOAP-Implementierungen bieten Bindungen für gängige Transportprotokolle wie HTTP oder SMTP.
HTTP ist synchron und weit verbreitet. Eine SOAP-HTTP-Anfrage gibt mindestens zwei HTTP-Header an: Content-Type und Content-Length.
SMTP ist asynchron und wird als letzter Ausweg oder in besonderen Fällen verwendet.
Java-Implementierungen von SOAP bieten normalerweise eine spezifische Bindung für das JMS-Protokoll (Java Messaging System).
Inhaltstyp
Der Content-Type-Header für eine SOAP-Anforderung und -Antwort definiert den MIME-Typ für die Nachricht und die Zeichencodierung (optional), die für den XML-Hauptteil der Anforderung oder Antwort verwendet wird.
Syntax
Content-Type: MIMEType; charset=character-encoding
Beispiel
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Inhaltslänge
Der Content-Length-Header für eine SOAP-Anforderung und -Antwort gibt die Anzahl der Bytes im Hauptteil der Anforderung oder Antwort an.
Syntax
Content-Length: bytes
Beispiel
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
Ein SOAP-Beispiel
Im folgenden Beispiel wird eine GetStockPrice-Anforderung an einen Server gesendet. Die Anfrage hat einen StockName-Parameter und einen Price-Parameter, der in der Antwort zurückgegeben wird. Der Namespace für die Funktion ist in "http://www.example.org/stock" definiert.
Eine SOAP-Anfrage:
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPrice>
<m:StockName>IBM</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
Die SOAP-Antwort:
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPriceResponse>
<m:Price>34.5</m:Price>
</m:GetStockPriceResponse>
</soap:Body>
</soap:Envelope>