1. Vad är SOAP?
SOAP står för "Simple Object Access Protocol" och är ett protokoll för utbyte av strukturerad information i form av XML. En mer precis definition ges nedan:
- Def: SOAP provides a simple and lightweight mechanism for exchanging structured and typed information between peers in a decentralized, distributed environment using XML. SOAP does not itself define any application semantics such as a programming model or implementation specific semantics; rather it defines a simple mechanism for expressing application semantics by providing a modular packaging model and encoding mechanisms for encoding data within modules. This allows SOAP to be used in a large variety of systems ranging from messaging systems to RPC.
Definitionen ovan är tagen från SOAP 1.1 specen.
- SOAP 1.1: Denna spec utfärdades av W3C år 2000. Specen kan hittas här
www.w3.org/TR/soap/ .
- SOAP 1.2: Denna spec utfärdades av W3C år 2003. Specen kan hittas på samma URL:
www.w3.org/TR/soap/ .
På denna sida kommer vi främst att diskutera SOAP 1.1, men skillnader mot SOAP 1.2 noteras i vissa fall i texten. SOAP har följande mekanismer:
- Mekanism för att stödja RPC.
- Mekanism för att överföra dokument.
- Mekanism för att definiera meddelandeutbytet.
- Mekanism för att representera data i meddelandet.
- Mekanism för felhatering.
- Mekanism för utökning av protokollet ("extension").
- Mekanism för att utnyttja protokollet tillsammans med HTTP.
2. SOAP-meddelandet
Egentligen är ett SOAP-meddelande mycket enkelt, vi tittar på 3 fall: 1. Den enklaste formen av SOAP-meddelande har följande struktur:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" >
<soap:Body>
<!-- Här kan du ha din XML -->
</soap:Body>
</soap:Envelope>
|
2. Eventuellt kan man ha ett SOAP-Header-element också, och då får vi följande utseende:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" >
<soap:Header>
<!-- Här kan du ha eventuell metadata -->
</soap:Header>
<soap:Body>
<!-- Här kan du ha din XML -->
</soap:Body>
</soap:Envelope>
|
3. Om ett SOAP-fel inträffar ska Body-taggen innehålla ett SOAP-Fault-element:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" >
<soap:Body>
<soap:Fault>
<!-- Detaljer för felet -->
</soap:Fault>
</soap:Body>
</soap:Envelope>
|
Dessa tre fall beskriver SOAP-meddelandets struktur, inga andra element än Hedader och Body får finnas i Envelope-elementet. Har man inte någon SOAP-Header är detta i princip allt man behöver känna till om SOAP. Dessutom är det valfritt att högst upp i meddelandet deklarera meddelandet som XML, vi får då följande utseende:
<?xml version = '1.0' encoding = 'UTF-8'?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" >
<soap:Body>
<!-- Här kan du ha din XML -->
</soap:Body>
</soap:Envelope>
|
I XML-deklarationen finns två attribut:
- version: Versionen av XML måste vara 1.0 (som är default).
- encoding: XML-encoding måste vara "UTF-8" eller "UTF-16" ("UTF-8" är default).
3. SOAP-specifikationens huvudområden
SOAP-specifikationen har följande huvudområden:
- SOAP envelope: Definierar hur formatet på ett SOAP-meddelande ska vara. Alltså; SOAP Body, SOAP Header, SOAP Fault o.s.v.
- SOAP data model: En abstrakt representation av typiska datastrukturer som är vanliga i programmeringsspråk.
- SOAP encoding: En mängd regler för hur datamodellen ("SOAP data model") ska beskrivas i XML.
- Using SOAP for RPC: Beskriver hur ett metodanrop och ett returvärde ska beskrivas i XML.
- SOAP protocol binding (Using SOAP in HTTP): Definierar än mängd regler som beskriver en metod för att överföra ett SOAP-meddelade från en nod till en annan.
Vi kommer att gå in på vissa av dessa områden senare på sidan. Som du ser handlar mycket av specifikationen om hur man ska underlätta RPC:
- Fokus på RPC: "SOAP data model" och "SOAP encoding" syftar till att underlätta RPC genom att beskriva hur datatyper överförs till XML. Avsnittet "Using SOAP for RPC" beskriver hur själva metodanropet beskrivs i XML. Dessa avsnitt bildar en komplett beskrivning på hur RPC uttrycks i XML.
4. Exempel på RPC i SOAP 1.1
Nedan ser vi hur metoden "add" anropas med två parametrar:
<?xml version = '1.0' encoding = 'UTF-8'?>
<env:Envelope
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns0="http://www.your_domain.com/ns/Calculator.xsd"
xmlns:ns1="http://www.your_domain.com/axis/services/Calculator">
<env:Body>
<ns0:add env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<addend1 xsi:type="xsd:int">123</addend1>
<addend2 xsi:type="xsd:int">23</addend2>
</ns0:add>
</env:Body>
</env:Envelope>
|
Och svaret är:
<?xml version = '1.0' encoding = 'UTF-8'?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:addResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns1="http://www.your_domain.com/ns/Calculator.xsd">
<addReturn xsi:type="xsd:int">146</addReturn>
</ns1:addResponse>
</soapenv:Body>
</soapenv:Envelope>
|
Ingen av dessa meddelandena har någon SOAP Header, men det är något vi ska titta mer på nu..