Ce billet est une très brève introduction à la technologie REST et sera complété ultérieurement.
Depuis plusieurs années déjà les WebServices sont à la mode, pour rappel simpliste, un web service est en général une unité de code exposée au monde extérieur. La manière d'utiliser et de communiquer avec cette unité de code est décrite par une enveloppe SOAP (Simple Object Access Protocol). L'enveloppe SOAP décrit un contrat contenant les end-points (ou point d'accès), ainsi que le format des messages pouvant être transférés.
Les web services mettent l'accent sur le process des données, en général on accède à une fonctionalité.
REST (REpresentational State Transfer) donne une autre approche, ici on ne s'intéresse pas aux résultats d'un processing sur les données mais aux données elle même. D'un certain point de vue cette approche est intéressante puisqu'elle rejoins la définition originale des URI
Une URI (Uniform Resource Indentifier) permet d'identifier une ressources
Elle peut être soit une URN (Uniform Resource Name) : ex hello.html ou une URL (Uniform Resource Locator) : http://www.domain.be/hello.html
En général la plupart des URI ne servent pas à identifier ou localiser une resources mais a effectuer des actions:
ex: http://www.sdlg.be/sibyl/updateStudyItem?studyId=123
Ici on désigne clairement une action à effectuer sur une ressource en l'occurrence une study.
En technologie REST l'url aurait plutôt cette forme
http://www.sdlg.be/sibyl/studies/123
Un verbe sera également utilisé : GET, POST, PUT, DELETE.
La représentation des données peut se faire de diverses manières : HTML, XML, JSON
Le framework Spring utilise l'annotation @PathVariable pour récupérer le paramètre 123
De plus pour retourner du json, il faudra modifier le HTTP-HEADER en utilisant un bean de type:
ContentNegotiatingViewResolver et en le paramétrant pour json. Il faudra aussi installer l'artefact:
MappingJacksonHttpMessageConverter pour convertir les objets en flux json.
En PERL, on peut faire cela assez facilement avec JSON::PP (pure perl) ou JSON::XS (compilé en natif) qui contient la fonction to_json qui transforme une map ou une list de map en flux json.
Une rêquete GET en REST pourrait donc renvoyer un flux json représentant l'étude 123.
PUT permettrait de faire juste le contraire renvoyé l'état de l'étude 123 du client vers le serveur.
Avec l'utilisation de plus en plus fréquente de framework javascript basé sur AJAX une approche REST peut avoir quelques avantages non négligeables.
On peut bien sûr aller plus loin, comme SOAP, REST est basé sur HTTP (à la différence de SOAP, il se focalise sur l'état des objets, les données), donc il est possible de créer des clients REST n'ayant rien à voir avec un browser classique.
Il faut aussi noter que REST est nettement moins lourd que SOAP à la mise en oeuvre, maintenant Spring WS fait déjà beaucouop pour nous quant à la mise en place de WebService.