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 :
- un service de transport
- un système de messages XML
- une description des services
- un système de découverte des services
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
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
- Conçu par Dave Winer, Don Box, Bob Atkinson, and Mohsen Al-Ghosein (MS) en 1999-2000
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>
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 :
- 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
- les données technique de chaque web service sont ajoutés dans l'annuaire : éléments tModels (pages vertes)
- 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 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 !
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 !
- 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
Avantages 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
Un simple browser peut accéder aux données de l'application (GET HTTP)