SOAP

Úvod

SOAP bol pôvodne skratkou pre Simple Object Access Protocol (protokol na jednoduchý prístup k objektom). Pred niekoľkými bol SOAP určený na realizáciu DCOM-u a Corby (napr. volaní RPC) cez internet. Pôvodní autori sa zameriavali na „prístup k objektom“, časom sa však od SOAP-u očakávalo poskytovanie služieb oveľa širšiemu publiku. Práve preto sa zameranie špecifikácie rýchlo zmenilo z objektov na všeobecný rámec na komunikáciu XML. Dnešná oficiálna definícia, ktorú nájdete v najnovšej špecifikácii SOAP 1.2, už objekty ani nespomína :
SOAP je jednoduchý protokol, určený na výmenu štruktúrovaných informácií v decentralizovanom, distribuovanom prostredí. SOAP používa technológie XML na definovanie rozšíriteľného komunikačného rámca poskytujúceho štruktúru správ, ktoré môžu byť vymieňané prostredníctvom množstva základných protokolov. Rámec bol navrhnutý tak, aby bol nezávislý od každého konkrétneho programovacieho modelu a iných špecifických sémantík jednotlivých implementácií.

SOAP možno použiť s nadviazaním na ľubovoľný transportný protokol, ako je TCP, HTTP, SMTP. Aby bola zachovaná interoperabilita, nadviazania na protokoly musia byť definované tak, aby načrtli pravidlá pre každé prostredie. Špecifikácia SOAP poskytuje flexibilný rámec na definovanie nadviazania na ľubovoľný protokol a v súčasnosti poskytuje priame nadviazanie na HTTP, pretože ide o všeobecne zaužívaný štandard.

SOAP je prístupný pre ľubovoľný programovací model a nie je nadviazaný na RPC. Mnohí vývojári okamžite prirovnávajú SOAP k uskutočňovaniu volaní RPC na distribuované objekty (možno i preto, že to spočiatku bolo celé o „pristupovaní k objektom“), hoci v skutočnosti sa základný model SOAP viac podobá na tradičné komunikačné systémy, ako je MSMQ. SOAP definuje model na spracovanie jednotlivých, jednosmerných správ. Jednotlivé správy môžete následne kombinovať do celkovej komunikácie. Prvý obrázok ilustruje jednoduchú jednosmernú správu, pri ktorej odosielateľ nedostáva od prijímateľa odpoveď. Príjemca však môže odpoveď príjemcovi späť poslať (pozri druhý obrázok).

Zatiaľ je dostupná verzia SOAP 1.1, verzia SOAP 1.2 má deklarovaný stav „Candidate Recommendation“ (adept na odporúčanie), čo znamená, že sa nachádza vo fáze implementácie, ktorá nie je ďaleko od finálneho ukončenia. V momente, keď SOAP 1.2 získa stav „Recommendation“ (odporúčanie), rýchlo si získa podporu vývojárov. SOAP 1.1 je identifikovaný obálkou http://schemas.xmlsoap.org/soap/envelope/, kým v momente stavu „Recommendation“ bude identifikovať SOAP 1.2 obálka http://www.w3.org/2002/12/soap-envelope.

Komunikačný rámec


Hlavnou časťou špecifikácie SOAP je komunikačný rámec. Komunikačný rámec SOAP definuje súpravu elementov XML na „zabalenie“ ľubovoľných správ XML na ich výmenu medzi systémami.
Rámec pozostáva z nasledujúcich kľúčových XML elementov: Envelope (obálka), Header (hlavička), Body (telo) a Fault (chyba), z ktorých všetky pochádzajú z namespace http://schemas.xmlsoap.org/soap/envelope v SOAP 1.1.

Ak si prezriete definíciu complexType pre element Envelope, pomerne rýchlo zistíte, ako elementy vzájomne súvisia. Nasledujúca šablóna pre správu ilustruje štruktúru obálky SOAP:

<soap:Envelope
   xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header> <!-- voliteľná -->
    <!--sem patria bloky hlavičky... -->
  </soap:Header>
  <soap:Body>
    <!--sem patrí telo správy alebo element Fault (chyby)... -->
  </soap:Body>
</soap:Envelope>


Element Envelope je vždy kľúčová časť správy SOAP. Zabezpečuje pre aplikácie jednoduchú identifikáciu SOAP správ nahliadnutím do názvu elementu root. Aplikácie môžu rovnako rozoznať verziu SOAP-u preskúmaním namespace názvu elementu Envelope.

Obálka obsahuje i voliteľný element Header (hlavička), po ktorom nasleduje povinný element Body (telo). Telo reprezentuje obsah správy. Element Body je všeobecný kontajner, ktorý môže obsahovať ľubovoľné množstvo elementov z ľubovoľného namespace. Práve toto je miesto, kam umiestňujete dáta, ktoré chcete poslať.

Príkladom je nasledujúca SOAP správa, ktorá je požiadavkou na prevod peňazí medzi dvojicou účtov:

<soap:Envelope
 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 <soap:Body>
  <x:Prevod xmlns:x="urn:examples-org:banking">
   <z_uctu>22-342439</z_uctu>
   <na_ucet>98-283843</na_ucet>
   <suma>100.00</suma>
  </x:Prevod>
 </soap:Body>
</soap:Envelope>

Kódovanie jednotlivých typov:

       V tejto tabuľke sú uvedené štandartné typy, ktoré sa používajú v Jave a prislúchajúce ku nim typy XML používané v SOAP.

Java SOAP

int a = 10;

<a xsi:type="xsd:int">10</a>

float x = 3.14159;

<x xsi:type="xsd:float">3.1415</x>

java.lang.String s = "SOAP";

<s xsi:type="xsd:string">SOAP</s>

int[3] iArray = {10, 20, 30};

<iArray xsi:type=SOAP-ENC:Array SOAP- ENC:arrayType="xsd:int[3]">   <val>10</val>   <val>20</val>   <val>30</val>

</iArray>

class Sample {   public int iVal = 10;   public java.lang.String sVal = "Ten";}

Sample samp = new Sample( );

<Sample>   <iVal xsi:type="xsd:int">10</iVal>   <sVal xsi:type="xsd:string">Ten</sVal>

</Sample>

 

Ak prijímateľ podporuje metódu request/response a je schopný úspešne spracovať správu, mal by pôvodnému odosielateľovi odoslať späť správu SOAP. V takomto prípade sa bude informácia odpovede nachádzať takisto v elemente Body, ako vidieť na nasledujúcom príklade:

<soap:Envelope
 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 <soap:Body>
  <x:PrevodOdpoved
   xmlns:x="urn:examples-org:banking">
   <zostatky>
    <ucet>
     <cislo>22-342439</cislo>
     <zostatok>33.45</zostatok>
    </ucet>
    <ucet>
     <cislo>98-283843</cislo>
     <zostatok>932.73</zostatok>
    </ucet>
   </zostatky>
  </x:PrevodOdpoved>
 </soap:Body>
</soap:Envelope>

Komunikačný rámec definuje v Body i element s názvom Fault, ktorý slúži na reprezentáciu chybových stavov, ak vznikne nejaký problém. To je dôležité, pretože bez štandardnej chybovej reprezentácie by každá aplikácia musela vyvinúť svoj vlastný systém, čo by znamenalo nemožnosť odlíšenia úspechu od zlyhania v rámci všeobecných infraštruktúr. Nasledujúca správa SOAP obsahuje element Fault, ktorý informuje o tom, že počas spracovania požiadavky vznikla chyba „Nedostatok finančných prostriedkov na účte“:

<soap:Envelope
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 <soap:Body>
  <soap:Fault>
   <faultcode>soap:Server</faultcode>
   <faultstring>Nedostatok finančných prostriedkov na účte</faultstring>
   <detail>
    <x:TransferError xmlns:x="urn:examples-org:banking">
     <ZdrojovyUcet>22-342439</ZdrojovyUcet>
     <SumaTransakcie>100.00</SumaTransakcie>
     <AktualnyZostatok>89.23</AktualnyZostatok>
    </x:TransferError>
   </detail>
  </x:TransferFunds>
 </soap:Body>
</soap:Envelope>

Linky :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsoap/html/understandsoap.asp

http://www.w3.org/TR/2000/NOTE-SOAP-20000508

http://www.w3.org/TR/soap

http://en.wikipedia.org/wiki/Simple_Object_Access_Protocol#Transport_methods