SOAP

Simple Object Access Protocol. Protocole simple d'accès aux objets.

Besoin

Définir un protocole standard et léger d'échange d'informations en environnement distribué et décentralisé.

Analyse

SOAP est constitué de :

L'ensemble de ces éléments exploitent XML.

SOAP peut être potentiellement utilisé au-dessus de divers protocoles, mais l'est généralement au-dessus de HTTP. Il utilise dans ce cas le framework d'extension de HTTP pour ajouter des champs spécifiques à SOAP dans l'en-tête HTTP.

Exemples

Message

Voici un exemple de message SOAP dans une requête HTTP. On y reconnaît l'en-tête HTTP étendu pour SOAP (avec le champ d'en-tête SOAPAction), l'enveloppe SOAP (balise SOAP-ENV), l'appel de service Web (balise ns1:getRate) avec ses paramètres (deux paramètres via les balises country1 et country2 en l'occurence) :

POST /servlet/rpcrouter HTTP/1.0<br> Host:www.javarome.net<br> Content-Type:text/xml;charset=utf-8<br> Content-Length:494<br> <strong>SOAPAction</strong>:""<br> <?xml version=’1.0 ’encoding=’UTF-8 ’?><br> <b><</b>SOAP-ENV<b>:Envelope </b>xmlns<b>:</b>SOAP-ENV<b>="https://schemas.xmlsoap.org/soap/envelope/" </b>xmlns:xsi<b>=</b>"https://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="https://www.w3.org/2001/XMLSchema"><b><br> <</b>SOAP-ENV<b>:Header </b>SOAP-ENV<b>:mustUnderstand="1"><br> <transaction><br> <identifiant></b>02DF25<b><identifiant><br> <type></b>2 phase commit<b></type><br> </transaction><br> </</b><strong>SOAP-ENV</strong><b>:Header><br> <</b>SOAP-ENV<b>:Body><br> <</b>ns1<b>:</b>getRate<b> </b>xmlns:ns1="urn<b>:</b>Exchange<b>" </b>SOAP-ENV<b>:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/"><br> <</b>country1<b> </b>xsi:type<b>=</b>"xsd:string"<b>></b>USA<b></</b>country1<b>><br> <</b>country2<b> </b>xsi:type<b>=</b>"xsd:string"<b>></b>Germany<b></</b>country2<b>><br> </</b>ns1<b>:</b>getRate<b> ><br> </</b>SOAP-ENV<b>:Body><br> </</b>SOAP-ENV<b>:Envelope></b>

Fournisseur

public class Exchange <br> {<br> public float getRate (String country1, String country2)<br> {<br> <span class="codeComment">// Recherche taux de change dans la base</span><br> return rate;<br> }<br> }

Client

public class SoapClient <br> {<br> public void static main (String[] args) <br> {<br> <b>Call</b> call = new <b>Call</b>();<br> <br> call.<b>setEncodingStyleURI</b> (<b>Constants.NS_URI_SOAP_ENC</b>);<br> call.<b>setTargetObjectURI</b> (<span class="codeString">"<b>urn:</b>Exchange"</span>);<br> call.<b>setMethod</b> (<span class="codeString">"getRate"</span>);<br> <br> Vector params = new Vector();<br> params.addElement (new <b>Parameter</b> (<span class="codeString">"country1"</span>, String.class, <span class="codeString">"USA"</span>, <b>Constants.NS_URI_SOAP_ENC</b>); <span class="codeComment">// 2nd param</span><br> call.setParams (params);<br> <br> URL url = new URL (<span class="codeString">"https://www.exch.com/soap/servlet/rpcrouter"</span>);<br> <br> <b>Response</b> resp = call.<b>invoke</b> (url, <span class="codeString">"<b>urn:</b>Exchange"</span>);<br> <br> if (! resp.<b>generatedFault</b>())<br> Object obj = resp.<b>getReturnValue</b>().<b>getValue</b> ();<br> <br> // Traite le résultat<br> }<br> }

Notes