XML -zeep
- SOAP staat voor S imple Object A ccess Protocol
- SOAP is een communicatieprotocol voor toepassingen
- SOAP is een formaat voor het verzenden en ontvangen van berichten
- SOAP is platformonafhankelijk
- SOAP is gebaseerd op XML
- SOAP is een W3C-aanbeveling
Waarom SOAP?
Voor webapplicaties is het belangrijk om via internet te kunnen communiceren.
De beste manier om tussen applicaties te communiceren is via HTTP, omdat HTTP door alle internetbrowsers en servers wordt ondersteund. Hiervoor is SOAP in het leven geroepen.
SOAP biedt een manier om te communiceren tussen applicaties die draaien op verschillende besturingssystemen, met verschillende technologieën en programmeertalen.
SOAP-bouwstenen
Een SOAP-bericht is een gewoon XML-document dat de volgende elementen bevat:
- Een Envelop-element dat het XML-document identificeert als een SOAP-bericht
- Een Header-element dat header-informatie bevat
- Een Body-element dat oproep- en antwoordinformatie bevat
- Een foutelement dat fouten en statusinformatie bevat
Alle bovenstaande elementen worden gedeclareerd in de standaard naamruimte voor de SOAP-envelop:
http://www.w3.org/2003/05/soap-envelope/
en de standaardnaamruimte voor SOAP-codering en gegevenstypen is:
http://www.w3.org/2003/05/soap-encoding
Syntaxisregels
Hier zijn enkele belangrijke syntaxisregels:
- EEN SOAP-bericht MOET worden gecodeerd met XML
- Een SOAP-bericht MOET de SOAP Envelope-naamruimte gebruiken
- Een SOAP-bericht mag GEEN DTD-referentie bevatten
- Een SOAP-bericht mag GEEN XML-verwerkingsinstructies bevatten
skelet SOAP-bericht
<?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>
Het SOAP-envelopelement
Het vereiste SOAP Envelope-element is het root-element van een SOAP-bericht. Dit element definieert het XML-document als een SOAP-bericht.
Voorbeeld
<?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>
De xmlns:soap-naamruimte
Let op de xmln:soap naamruimte in het bovenstaande voorbeeld. Het moet altijd de waarde hebben van: "http://www.w3.org/2003/05/soap-envelope/".
De naamruimte definieert de envelop als een SOAP-envelop.
Als een andere naamruimte wordt gebruikt, genereert de toepassing een fout en negeert het bericht.
Het encodingStyle Attribuut
Het kenmerk encodingStyle wordt gebruikt om de gegevenstypen te definiëren die in het document worden gebruikt. Dit attribuut kan op elk SOAP-element voorkomen en is van toepassing op de inhoud van het element en alle onderliggende elementen.
Een SOAP-bericht heeft geen standaardcodering.
Syntaxis
soap:encodingStyle="URI"
Voorbeeld
<?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>
Het SOAP-headerelement
Het optionele SOAP Header-element bevat toepassingsspecifieke informatie (zoals authenticatie, betaling, enz.) over het SOAP-bericht.
Als het Header-element aanwezig is, moet dit het eerste onderliggende element van het Envelope-element zijn.
Opmerking: Alle directe onderliggende elementen van het Header-element moeten gekwalificeerd zijn voor de naamruimte.
<?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>
Het bovenstaande voorbeeld bevat een header met een "Trans"-element, een "mustUnderstand"-attribuut met een waarde van 1, en een waarde van 234.
SOAP definieert drie attributen in de standaardnaamruimte. Deze kenmerken zijn: mustUnderstand, actor en encodingStyle.
De kenmerken die zijn gedefinieerd in de SOAP-header bepalen hoe een ontvanger het SOAP-bericht moet verwerken.
Het mustUnderken-attribuut
Het SOAP mustUnderstand attribuut kan worden gebruikt om aan te geven of een header-invoer verplicht of optioneel is voor de ontvanger om te verwerken.
Als u mustUnderstand="1" toevoegt aan een onderliggend element van het Header-element, geeft dit aan dat de ontvanger die de Header verwerkt, het element moet herkennen. Als de ontvanger het element niet herkent, zal het mislukken bij het verwerken van de header.
Syntaxis
soap:mustUnderstand="0|1"
Voorbeeld
<?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>
De acteur Attribuut
Een SOAP-bericht kan van een zender naar een ontvanger reizen door verschillende eindpunten langs het berichtpad te passeren. Het is echter mogelijk dat niet alle delen van een SOAP-bericht bedoeld zijn voor het uiteindelijke eindpunt, in plaats daarvan kan het bedoeld zijn voor een of meer van de eindpunten op het berichtpad.
Het SOAP-acteurkenmerk wordt gebruikt om het Header-element aan een specifiek eindpunt te adresseren.
Syntaxis
soap:actor="URI"
Voorbeeld
<?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>
Het encodingStyle Attribuut
Het kenmerk encodingStyle wordt gebruikt om de gegevenstypen te definiëren die in het document worden gebruikt. Dit attribuut kan op elk SOAP-element voorkomen en is van toepassing op de inhoud van dat element en alle onderliggende elementen.
Een SOAP-bericht heeft geen standaardcodering.
Syntaxis
soap:encodingStyle="URI"
Het SOAP-lichaamselement
Het vereiste SOAP Body-element bevat het eigenlijke SOAP-bericht dat bedoeld is voor het uiteindelijke eindpunt van het bericht.
Onmiddellijke onderliggende elementen van het SOAP Body-element kunnen gekwalificeerd zijn voor de naamruimte.
Voorbeeld
<?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>
Bovenstaand voorbeeld vraagt om de prijs van appels. Merk op dat de m:GetPrice en de Item-elementen hierboven toepassingsspecifieke elementen zijn. Ze maken geen deel uit van de SOAP-naamruimte.
Een SOAP-reactie kan er ongeveer zo uitzien:
<?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>
Het SOAP-foutelement
Het optionele SOAP Fault-element wordt gebruikt om foutmeldingen aan te geven.
Het SOAP Fault-element bevat fouten en statusinformatie voor een SOAP-bericht.
Als er een Fault-element aanwezig is, moet dit worden weergegeven als een onderliggend element van het Body-element. Een Fault-element kan maar één keer voorkomen in een SOAP-bericht.
Het SOAP Fault-element heeft de volgende subelementen:
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-foutcodes
De hieronder gedefinieerde foutcodewaarden moeten worden gebruikt in het foutcode-element bij het beschrijven van fouten:
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 |
Het HTTP-protocol
HTTP communiceert via TCP/IP. Een HTTP-client maakt verbinding met een HTTP-server via TCP. Na het tot stand brengen van een verbinding kan de client een HTTP-verzoekbericht naar de server sturen:
POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200
De server verwerkt vervolgens het verzoek en stuurt een HTTP-antwoord terug naar de client. Het antwoord bevat een statuscode die de status van het verzoek aangeeft:
200 OK
Content-Type: text/plain
Content-Length: 200
In het bovenstaande voorbeeld heeft de server een statuscode van 200 geretourneerd. Dit is de standaard succescode voor HTTP.
Als de server het verzoek niet kon decoderen, had het zoiets als dit kunnen retourneren:
400 Bad Request
Content-Length: 0
SOAP-binding
De SOAP-specificatie definieert de structuur van de SOAP-berichten, niet hoe ze worden uitgewisseld. Deze leemte wordt opgevuld door zogenaamde "SOAP-bindingen". SOAP-bindingen zijn mechanismen waarmee SOAP-berichten effectief kunnen worden uitgewisseld met behulp van een transportprotocol.
De meeste SOAP-implementaties bieden bindingen voor algemene transportprotocollen, zoals HTTP of SMTP.
HTTP is synchroon en wordt veel gebruikt. Een SOAP HTTP-verzoek specificeert ten minste twee HTTP-headers: Content-Type en Content-Length.
SMTP is asynchroon en wordt in laatste instantie of in bepaalde gevallen gebruikt.
Java-implementaties van SOAP bieden meestal een specifieke binding voor het JMS-protocol (Java Messaging System).
Inhoudstype
De Content-Type-header voor een SOAP-verzoek en -antwoord definieert het MIME-type voor het bericht en de tekencodering (optioneel) die wordt gebruikt voor de XML-hoofdtekst van het verzoek of antwoord.
Syntaxis
Content-Type: MIMEType; charset=character-encoding
Voorbeeld
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Inhoud lengte
De Content-Length-header voor een SOAP-verzoek en -antwoord specificeert het aantal bytes in de hoofdtekst van het verzoek of antwoord.
Syntaxis
Content-Length: bytes
Voorbeeld
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
Een SOAP-voorbeeld
In het onderstaande voorbeeld wordt een GetStockPrice-verzoek naar een server gestuurd. De aanvraag heeft een StockName-parameter en een Prijs-parameter die in het antwoord wordt geretourneerd. De naamruimte voor de functie is gedefinieerd in "http://www.example.org/stock".
Een SOAP-verzoek:
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>
De SOAP-reactie:
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>