Services Web

Tour d'horison de XMLRPC, SOAP et REST

Initiation Linux-Nantes, le 10 avril 2007

Damien Raude-Morvan

drazzib@drazzib.com

Web Services ?

Web Service = une pile de protocoles :
  • un service de transport
  • un système de messages XML
  • une description des services
  • un système de découverte des services

XMLRPC

XMLRPC, l'ancetre

  • Concu par Dave Winer en 1998
  • Protocole très simple : les spécifications tiennent sur 2 pages recto-verso
  • Formalisme XML et transport via HTTP

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

SOAP : une norme industrielle

  • Conçu par Dave Winer, Don Box, Bob Atkinson, and Mohsen Al-Ghosein (MS) en 1999-2000
  • Web Service - from Wikipedia

SOAP + WSDL + UDDI

HTTP + SOAP + WSDL + UDDI = la pile Web Service officielle du W3C :
  • un service de transport : HTTP, Hypertext Transfer Protocol
  • un système de messages XML : SOAP, Simple Object Access Protocol
  • une description des services : WSDL, Web Services Description Language
  • un système de découverte des services : UDDI, Universal Description Discovery and Integration

WSDL : structure XML

  • <portType> : les opérations réalisées par ce service
  • <message> : les messages traités
  • <types> : les types (objets) utilisés
  • <binding> : le protocole utilisé

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>

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>

UDDI : hum hum ?

UDDI est un annuaire qui permet de stocker des informations sur des services web. Il peut-être représenté comme :
  • pages blanches liste les entreprises ainsi que des informations associées à ces dernières
  • pages jaunes recensent les services web de chacune des entreprises sous le standard WSDL
  • pages vertes fournissent des informations techniques précises sur les services fournis

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 :
  • Find : find_business, find_service, find_binding, find_tModel
  • Get details : get_businessDetail, get_serviceDetail, get_bindingDetail, get_tModelDetail
  • Save : save_business, save_service, save_binding, save_tModel
  • Delete : delete_business, delete_service, delete_binding, delete_tModel

REST

REST

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

  • imaginé par Roy Fielding (année 2000)
  • Roy Fielding = un des auteurs du protocole HTTP (RFCXXXX)
  • Pas uniquement limité aux échanges machines / machines !

REST : les URI ont un sens !

  • Chaque resource de l'application est accessible via une URI unique
  • Les opérations (notion CRUD) sont uniformes entre les resources (avec HTTP, proche de WebDAV)
  • Aucune notion d'état entre une suite d'actions (= pas de session utilisateur en HTTP)

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

  • Stateless = consommation de mémoire inférieure
  • Stateless = mise au point plus simple, moins de cas à traiter
  • URI uniques = mise en cache possible donc meilleure montée en charge
  • Proche de la philosophie d'HTTP = moins de dépendances à une implémentation particulière