XML mýdlo
- SOAP je zkratka pro S imple O bject A ccess P rotocol
- SOAP je aplikační komunikační protokol
- SOAP je formát pro odesílání a přijímání zpráv
- SOAP je nezávislý na platformě
- SOAP je založen na XML
- SOAP je doporučení W3C
Proč SOAP?
Pro webové aplikace je důležité, aby mohly komunikovat přes internet.
Nejlepší způsob komunikace mezi aplikacemi je přes HTTP, protože HTTP podporují všechny internetové prohlížeče a servery. SOAP byl vytvořen, aby toho dosáhl.
SOAP poskytuje způsob komunikace mezi aplikacemi běžícími na různých operačních systémech, s různými technologiemi a programovacími jazyky.
Stavební bloky SOAP
Zpráva SOAP je běžný dokument XML obsahující následující prvky:
- Element Envelope, který identifikuje dokument XML jako zprávu SOAP
- Prvek záhlaví, který obsahuje informace záhlaví
- Element Body, který obsahuje informace o volání a odpovědi
- Element Fault obsahující chyby a informace o stavu
Všechny výše uvedené prvky jsou deklarovány ve výchozím jmenném prostoru pro obálku SOAP:
http://www.w3.org/2003/05/soap-envelope/
a výchozí jmenný prostor pro kódování SOAP a datové typy je:
http://www.w3.org/2003/05/soap-encoding
Pravidla syntaxe
Zde jsou některá důležitá pravidla syntaxe:
- Zpráva SOAP MUSÍ být kódována pomocí XML
- Zpráva SOAP MUSÍ používat jmenný prostor SOAP Envelope
- Zpráva SOAP NESMÍ obsahovat odkaz na DTD
- Zpráva SOAP NESMÍ obsahovat instrukce pro zpracování XML
Zpráva Skelet SOAP
<?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>
Element obálky SOAP
Požadovaný prvek SOAP Envelope je kořenovým prvkem zprávy SOAP. Tento prvek definuje dokument XML jako zprávu SOAP.
Příklad
<?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>
Jmenný prostor xmlns:soap
Všimněte si jmenného prostoru xmlns:soap ve výše uvedeném příkladu. Vždy by měl mít hodnotu: „http://www.w3.org/2003/05/soap-envelope/“.
Jmenný prostor definuje obálku jako SOAP obálku.
Pokud je použit jiný jmenný prostor, aplikace vygeneruje chybu a zprávu zahodí.
Atribut encodingStyle
Atribut encodingStyle se používá k definování datových typů použitých v dokumentu. Tento atribut se může objevit na libovolném prvku SOAP a vztahuje se na obsah prvku a všechny podřízené prvky.
Zpráva SOAP nemá žádné výchozí kódování.
Syntax
soap:encodingStyle="URI"
Příklad
<?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>
Prvek záhlaví SOAP
Volitelný prvek záhlaví SOAP obsahuje informace specifické pro aplikaci (jako je ověření, platba atd.) o zprávě SOAP.
Pokud je přítomen prvek Záhlaví, musí to být první podřízený prvek prvku Obálka.
Poznámka: Všechny bezprostřední podřízené prvky prvku Header musí být kvalifikované pro jmenný prostor.
<?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>
Výše uvedený příklad obsahuje záhlaví s prvkem „Trans“, atribut „mustUnderstand“ s hodnotou 1 a hodnotou 234.
SOAP definuje tři atributy ve výchozím jmenném prostoru. Tyto atributy jsou: mustUnderstand, herec a encodingStyle.
Atributy definované v hlavičce SOAP definují, jak by měl příjemce zpracovat zprávu SOAP.
Atribut mustUnderstand
Atribut SOAP mustUnderstand lze použít k označení, zda je záznam záhlaví pro příjemce povinný nebo volitelný.
Pokud přidáte mustUnderstand="1" k podřízenému prvku prvku Header, znamená to, že příjemce zpracovávající záhlaví musí prvek rozpoznat. Pokud přijímač nerozpozná prvek, selže při zpracování záhlaví.
Syntax
soap:mustUnderstand="0|1"
Příklad
<?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>
Atribut herce
Zpráva SOAP může cestovat od odesílatele k příjemci průchodem různých koncových bodů podél cesty zprávy. Ne všechny části zprávy SOAP však mohou být určeny pro konečný koncový bod, místo toho může být určena pro jeden nebo více koncových bodů na cestě zprávy.
Atribut aktéra SOAP se používá k adresování prvku Header ke konkrétnímu koncovému bodu.
Syntax
soap:actor="URI"
Příklad
<?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>
Atribut encodingStyle
Atribut encodingStyle se používá k definování datových typů použitých v dokumentu. Tento atribut se může objevit na libovolném prvku SOAP a bude se vztahovat na obsah tohoto prvku a všechny podřízené prvky.
Zpráva SOAP nemá žádné výchozí kódování.
Syntax
soap:encodingStyle="URI"
Element těla SOAP
Požadovaný prvek SOAP Body obsahuje skutečnou zprávu SOAP určenou pro konečný koncový bod zprávy.
Bezprostřední podřízené prvky prvku SOAP Body mohou být kvalifikované pro jmenný prostor.
Příklad
<?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>
Výše uvedený příklad požaduje cenu jablek. Všimněte si, že výše uvedené prvky m:GetPrice a Item jsou prvky specifické pro aplikaci. Nejsou součástí jmenného prostoru SOAP.
Odpověď SOAP by mohla vypadat nějak takto:
<?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>
Prvek chyby SOAP
Volitelný prvek SOAP Fault se používá k označení chybových zpráv.
Element Fault SOAP uchovává chyby a informace o stavu pro zprávu SOAP.
Pokud je přítomen prvek Fault, musí se objevit jako podřízený prvek prvku Body. Element Fault se může ve zprávě SOAP objevit pouze jednou.
Prvek chyby SOAP má následující dílčí prvky:
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 |
Chybové kódy SOAP
Níže definované hodnoty chybového kódu musí být použity v prvku chybového kódu při popisu poruch:
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 |
Protokol HTTP
HTTP komunikuje přes TCP/IP. HTTP klient se připojuje k HTTP serveru pomocí TCP. Po navázání spojení může klient odeslat na server zprávu HTTP požadavku:
POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200
Server poté požadavek zpracuje a odešle HTTP odpověď zpět klientovi. Odpověď obsahuje stavový kód, který označuje stav požadavku:
200 OK
Content-Type: text/plain
Content-Length: 200
Ve výše uvedeném příkladu server vrátil stavový kód 200. Toto je standardní kód úspěchu pro HTTP.
Pokud server nemohl dekódovat požadavek, mohl vrátit něco takového:
400 Bad Request
Content-Length: 0
SOAP vazba
Specifikace SOAP definuje strukturu zpráv SOAP, nikoli způsob jejich výměny. Tato mezera je vyplněna tím, co se nazývá „SOAP Bindings“. Vazby SOAP jsou mechanismy, které umožňují efektivní výměnu zpráv SOAP pomocí transportního protokolu.
Většina implementací SOAP poskytuje vazby pro běžné transportní protokoly, jako je HTTP nebo SMTP.
HTTP je synchronní a široce používaný. Požadavek SOAP HTTP specifikuje alespoň dvě HTTP hlavičky: Content-Type a Content-Length.
SMTP je asynchronní a používá se v krajním případě nebo ve zvláštních případech.
Java implementace SOAP obvykle poskytují specifickou vazbu pro protokol JMS (Java Messaging System).
Typ obsahu
Záhlaví Content-Type pro požadavek a odpověď SOAP definuje typ MIME pro zprávu a kódování znaků (volitelné) použité pro tělo XML požadavku nebo odpovědi.
Syntax
Content-Type: MIMEType; charset=character-encoding
Příklad
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Obsah-délka
Záhlaví Content-Length pro požadavek a odpověď SOAP určuje počet bajtů v těle požadavku nebo odpovědi.
Syntax
Content-Length: bytes
Příklad
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
Příklad SOAP
V níže uvedeném příkladu je na server odeslán požadavek GetStockPrice. Požadavek má parametr StockName a parametr Cena, které budou vráceny v odpovědi. Jmenný prostor pro funkci je definován v „http://www.example.org/stock“.
Žádost SOAP:
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>
Odpověď SOAP:
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>