Services Web : XMLRPC, SOAP et REST

Damien Raude-Morvan - <drazzib@drazzib.com>

Linux-Nantes - http://www.linux-nantes.org/

Web Services ?

Web Service = une pile de protocoles :

XMLRPC, l'ancetre

Beaucoup plus impliste que d'autres langages RPC comme CORBA. Mais beaucoup plus lourd car XML.

XMLRPC : par l'exemple

<methodCall>
  <methodName>gasell.getUserName</methodName>
  <params>
    <param>
        <value><i4>4</i4></value>
    </param>
  </params>
</methodCall>
<methodResponse>
  <params>
    <param>
        <value><string>Damien</string></value>
    </param>
  </params>
</methodResponse>

SOAP : une norme industrielle

SOAP + WSDL + UDDI

HTTP + SOAP + WSDL + UDDI = la pile Web Service officielle du W3C :

WSDL : structure XML

WSDL : descriptions des services

<message name="getUserRequest">
   <part name="term" type="xs:string"/>
</message>

<message name="getUserResponse">
   <part name="value" type="xs:string"/>
</message>

<portType name="getUser">
  <operation name="getUser">
      <input message="getUserRequest"/>
      <output message="getUserResponse"/>
  </operation>
</portType>
Les opérations peuvent être de type entrée (seulement balise input) ou bien en entrée/sortie (balise input et output).

WSDL : en lien avec SOAP

[..]
<binding type="getUser" name="b1">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
  <operation>
    <soap:operation
     soapAction="http://gasell.org/getUser"/>
    <input>
      <soap:body use="literal"/>
    </input>
    <output>
      <soap:body use="literal"/>
    </output>
  </operation>
</binding>
binding : style : RPC ou Document / transport = http://schemas.xmlsoap.org/soap/http operation : soapAction : lien vers le document SOAP / use : literal (encoding du contenu)

UDDI : hum hum ?

UDDI est un annuaire qui permet de stocker des informations sur des services web. Il peut-être représenté comme :

UDDI : structure des données

  1. les données technique de chaque web service sont ajoutés dans l'annuaire : éléments tModels (pages vertes)
  2. les fiches de chaque entreprise et de leurs services sont également ajoutées : éléments BusinnessEntity et BusinnessService (page blanches et jaunes)

UDDI : tModel, détails techniques

<tModel xmlns="urn:uddi-org:api" tModelKey="UUID:AAAAAAAA-AAAA-AAAA-
AAAA-AAAAAAAAAAAA">
  <name>hp-com:creditcheck</name>
  <description xml:lang="en">Check limit reporter</description>
  <overviewDoc>
    <overviewURL>http://schema.com/creditcheck.wsdl</overviewURL>
  </overviewDoc>
  <categoryBag>
    <keyedReference
      tModelKey="UUID:CD153257-086A-4237-B336-6BDCBDCC6635"
      keyName="Consumer credit gathering or reporting services"
      keyValue="84.14.16.01.00"/>
    <keyedReference
      tModelKey="UUID:C1ACF26D-9672-4404-9D70-39B756E62AB4"
      keyName="types"
      keyValue="wsdlSpec"/>
  </categoryBag>
</tModel>

UDDI : service

<businessService
   businessKey="BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB"
   serviceKey="CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC">
   <name>HPCU Credit Check</name>
   <bindingTemplates>
    <bindingTemplate
     serviceKey="CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC"
     bindingKey="DDDDDDDD-DDDD-DDDD-DDDD-DDDDDDDDDDDD">
     <accessPoint URLType="https">https://hpcu.com/creditcheck</accessPoint>
     <tModelInstanceDetails>
      <tModelInstanceInfo tModelKey="UUID:AAAAAAAA-AAAA-AAAA-AAAA-
AAAAAAAAAAAA"/>
     <tModelInstanceDetails>
   </bindingTemplate>
  </bindingTemplates>
 </businessService>

UDDI : API SOAP

Un annuaire UDDI est bien sûr acessible lui-même via SOAP en utilisant l'API suivante :

REST

REST Representational State Transfer n'est pas un protocole mais un paradigme.

Un paradigme est une représentation du monde, une manière de voir les choses. ---- Representational State Transfer is intended to evoke an image of how a well-designed Web application behaves: a network of web pages (a virtual state-machine), where the user progresses through an application by selecting links (state transitions), resulting in the next page (representing the next state of the application) being transferred to the user and rendered for their use.

REST : les URI ont un sens !

Comparaison REST avec RPC

RPC :
getUser()
addUser()
removeUser()
updateUser()
findUser()
example = new ExampleApp("gasell.org:1234")
example.getUser()
REST :
http://gasell.org/users/
http://gasell.org/users/[id] (URI unique)
http://gasell.org/findUser
user = new Resource("http://gasell.org/users/001")
user.delete()

Avantage de REST

Avantages de REST :
Un simple browser peut accéder aux données de l'application (GET HTTP)