AccueilđŸ‡«đŸ‡·Chercher

Representational state transfer

REST (representational state transfer) est un style d'architecture logicielle dĂ©finissant un ensemble de contraintes Ă  utiliser pour crĂ©er des services web. Les services web conformes au style d'architecture REST, aussi appelĂ©s services web RESTful, Ă©tablissent une interopĂ©rabilitĂ© entre les ordinateurs sur Internet. Les services web REST permettent aux systĂšmes effectuant des requĂȘtes de manipuler des ressources web via leurs reprĂ©sentations textuelles Ă  travers un ensemble d'opĂ©rations uniformes et prĂ©dĂ©finies sans Ă©tat. D'autres types de services web tels que les services web SOAP exposent leurs propres ensembles d'opĂ©rations arbitraires[1].

ModĂšle d'information REST

Les ressources web ont Ă©tĂ© dĂ©finies pour la premiĂšre fois sur le World Wide Web comme des documents ou des fichiers identifiĂ©s par leur URL. Cependant, elles ont aujourd'hui une dĂ©finition beaucoup plus gĂ©nĂ©rique et abstraite qui inclut toute chose ou entitĂ© pouvant ĂȘtre identifiĂ©e, nommĂ©e, adressĂ©e ou gĂ©rĂ©e d'une façon quelconque sur le web. Dans un service web REST, les requĂȘtes effectuĂ©es sur l'URI d'une ressource produisent une rĂ©ponse dont le corps est formatĂ© en HTML, XML, JSON ou un autre format. La rĂ©ponse peut confirmer que la ressource stockĂ©e a Ă©tĂ© altĂ©rĂ©e et elle peut fournir des liens hypertextes vers d'autres ressources ou collection de ressources liĂ©es. Lorsque le protocole HTTP est utilisĂ©, comme c'est souvent le cas, les mĂ©thodes HTTP disponibles sont GET, HEAD, POST, PUT, PATCH, DELETE, CONNECT, OPTIONS et TRACE[2].

Avec l'utilisation d'un protocole sans Ă©tat et d'opĂ©rations standards, les systĂšmes REST visent la rĂ©activitĂ©, la fiabilitĂ© et l'extensibilitĂ©, par la rĂ©utilisation de composants pouvant ĂȘtre gĂ©rĂ©s et mis Ă  jour sans affecter le systĂšme global, mĂȘme pendant son fonctionnement.

Le terme representational state transfer a Ă©tĂ© dĂ©fini pour la premiĂšre fois en 2000 par Roy Fielding dans le chapitre 5 de sa thĂšse de doctorat[3] - [4] - [5]. La thĂšse de Fielding a expliquĂ© les principes de REST auparavant connus comme le « modĂšle objet de HTTP » depuis 1994 et qui ont Ă©tĂ© utilisĂ©s dans l'Ă©laboration des standards HTTP 1.1 et URI. Le terme est censĂ© Ă©voquer comment une application web bien conçue se comporte : c'est un rĂ©seau de ressources (une machine Ă  Ă©tats virtuelle) au sein duquel l'utilisateur Ă©volue en sĂ©lectionnant des identifiants de ressources telles que http://www.exemple.com/articles/21 et des opĂ©rations sur les ressources telles que GET ou POST (des transitions d'Ă©tat de l'application) transfĂ©rant une reprĂ©sentation de la ressource suivante (le nouvel Ă©tat de l'application) vers l'utilisateur pour ĂȘtre utilisĂ©e.

Histoire

Roy Fielding Ă  l'OSCON 2008.

Roy Fielding a défini REST en 2000 dans sa thÚse de doctorat Architectural Styles and the Design of Network-based Software Architectures à l'université de Californie à Irvine[3]. Il y a développé le style d'architecture REST en parallÚle du protocole HTTP 1.1 de 1996 à 1999, basé sur le modÚle existant de HTTP 1.0 de 1996[6].

Lors d'un regard rétrospectif sur le développement de REST, Fielding a déclaré:

« Throughout the HTTP standardization process, I was called on to defend the design choices of the Web. That is an extremely difficult thing to do within a process that accepts proposals from anyone on a topic that was rapidly becoming the center of an entire industry. I had comments from well over 500 developers, many of whom were distinguished engineers with decades of experience, and I had to explain everything from the most abstract notions of Web interaction to the finest details of HTTP syntax. That process honed my model down to a core set of principles, properties, and constraints that are now called REST. »

— Roy Fielding, Discussion sur le dĂ©veloppement de REST[6].

« Au cours de la procĂ©dure de standardisation de HTTP, on m'a appelĂ© pour dĂ©fendre les choix d'architecture du Web. C'est une tĂąche extrĂȘmement compliquĂ©e dans la mesure oĂč la procĂ©dure accepte les propositions de n'importe qui sur un sujet qui Ă©tait en train de devenir rapidement le centre d'une industrie entiĂšre. Je recevais les commentaires de plus de 500 dĂ©veloppeurs, dont de nombreux Ă©taient des ingĂ©nieurs renommĂ©s avec des dĂ©cennies d'expĂ©rience, et je devais tout expliquer, des notions les plus abstraites des interactions du Web jusqu'aux dĂ©tails les plus subtils de la syntaxe de HTTP. Cette procĂ©dure a rĂ©duit mon modĂšle Ă  un ensemble fondamental de principes, propriĂ©tĂ©s et contraintes qui sont aujourd'hui appelĂ©s REST. »

— Discussion sur le dĂ©veloppement de REST[6].

Contraintes architecturales

Six contraintes architecturales dĂ©finissent un systĂšme REST[7] - [8]. Ces contraintes restreignent la façon dont le serveur peut traiter et rĂ©pondre aux requĂȘtes du client afin que, en agissant dans ces contraintes, le systĂšme gagne des propriĂ©tĂ©s non fonctionnelles dĂ©sirables, telles que la performance, l'extensibilitĂ©, la simplicitĂ©, l'Ă©volutivitĂ©, la visibilitĂ©, la portabilitĂ© et la fiabilitĂ©[3]. Un systĂšme qui viole une de ces contraintes ne peut pas ĂȘtre considĂ©rĂ© comme adhĂ©rant Ă  l'architecture REST.

Client–serveur

Les responsabilitĂ©s sont sĂ©parĂ©es entre le client et le serveur. DĂ©coupler l'interface utilisateur du stockage des donnĂ©es amĂ©liore la portabilitĂ© de l'interface utilisateur sur plusieurs plateformes. L'extensibilitĂ© du systĂšme se retrouve aussi amĂ©liorĂ©e par la simplification des composants serveurs. Mais peut-ĂȘtre encore plus essentiel pour le Web, la sĂ©paration permet aux composants d'Ă©voluer indĂ©pendamment, supportant ainsi les multiples domaines organisationnels nĂ©cessaires Ă  l'Ă©chelle d'Internet.

Sans Ă©tat

La communication client–serveur s'effectue sans conservation de l'Ă©tat de la session de communication sur le serveur entre deux requĂȘtes successives. L'Ă©tat de la session est conservĂ© par le client et transmis Ă  chaque nouvelle requĂȘte. Les requĂȘtes du client contiennent donc toute l'information nĂ©cessaire pour que le serveur puisse y rĂ©pondre. La visibilitĂ© des interactions entre les composants s'en retrouve amĂ©liorĂ©e puisque les requĂȘtes sont complĂštes. La tolĂ©rance aux Ă©checs est Ă©galement plus grande. De plus, le fait de ne pas avoir Ă  maintenir une connexion permanente entre le client et le serveur permet au serveur de rĂ©pondre Ă  d'autres requĂȘtes venant d'autres clients sans saturer l'ensemble de ses ports de communication, ce qui amĂ©liore l'extensibilitĂ© du systĂšme.

Cependant une exception usuelle Ă  ce mode sans Ă©tat est la gestion de l'authentification du client, afin que celui-ci n'ait pas Ă  renvoyer ces informations Ă  chacune de ses requĂȘtes.

Avec mise en cache

Les clients et les serveurs intermĂ©diaires peuvent mettre en cache les rĂ©ponses. Les rĂ©ponses doivent donc, implicitement ou explicitement, se dĂ©finir comme pouvant ĂȘtre mise en cache ou non, afin d'empĂȘcher les clients de rĂ©cupĂ©rer des donnĂ©es obsolĂštes ou inappropriĂ©es en rĂ©ponse Ă  des requĂȘtes ultĂ©rieures. Une mise en cache bien gĂ©rĂ©e Ă©limine partiellement voire totalement certaines interactions client–serveur, amĂ©liorant davantage l'extensibilitĂ© et la performance du systĂšme.

En couches

Un client ne peut habituellement pas dire s'il est connecté directement au serveur final ou à un serveur intermédiaire. Les serveurs intermédiaires peuvent améliorer l'extensibilité du systÚme en mettant en place une répartition de charge et un cache partagé. Ils peuvent aussi renforcer les politiques de sécurité.

Avec code Ă  la demande (facultative)

Les serveurs peuvent temporairement Ă©tendre ou modifier les fonctionnalitĂ©s d'un client en lui transfĂ©rant du code exĂ©cutable. Par exemple par des applets Java ou des scripts JavaScript. Cela permet de simplifier les clients en rĂ©duisant le nombre de fonctionnalitĂ©s qu'ils doivent mettre en Ɠuvre par dĂ©faut et amĂ©liore l'extensibilitĂ© du systĂšme. En revanche, cela rĂ©duit aussi la visibilitĂ© de l'organisation des ressources. De ce fait, elle constitue une contrainte facultative dans une architecture REST.

Interface uniforme

La contrainte d'interface uniforme est fondamentale dans la conception de n'importe quel systÚme REST. Elle simplifie et découple l'architecture, ce qui permet à chaque composant d'évoluer indépendamment. Les quatre contraintes de l'interface uniforme sont les suivantes.

Identification des ressources dans les requĂȘtes
Chaque ressource est identifiĂ©e dans les requĂȘtes, par exemple par un URI dans le cas des systĂšmes REST basĂ©s sur le Web. Les ressources elles-mĂȘmes sont conceptuellement distinctes des reprĂ©sentations qui sont retournĂ©es au client. Par exemple, le serveur peut envoyer des donnĂ©es de sa base de donnĂ©es en HTML, XML ou JSON, qui sont des reprĂ©sentations diffĂ©rentes de la reprĂ©sentation interne de la ressource.
Manipulation des ressources par des représentations
Chaque représentation d'une ressource fournit suffisamment d'informations au client pour modifier ou supprimer la ressource.
Messages auto-descriptifs
Chaque message contient assez d'information pour savoir comment l'interprĂ©ter. Par exemple, l'interprĂ©teur Ă  invoquer peut ĂȘtre dĂ©crit par un type de mĂ©dias.
Hypermédia comme moteur d'état de l'application (HATEOAS)
AprĂšs avoir accĂ©dĂ© Ă  un URI initial de l'application — de maniĂšre analogue aux humains accĂ©dant Ă  la page d'accueil d'un site web —, le client doit ĂȘtre en mesure d'utiliser dynamiquement les hyperliens fournis par le serveur pour dĂ©couvrir toutes les autres actions possibles et les ressources dont il a besoin pour poursuivre la navigation. Il n'est pas nĂ©cessaire pour le client de coder en dur cette information concernant la structure ou la dynamique de l'application.

Propriétés architecturales

Les contraintes architecturales de REST confÚrent aux systÚmes qui les respectent les propriétés architecturales suivantes[3] - [7] :

  • performance dans les interactions des composants, qui peuvent ĂȘtre le facteur dominant dans la performance perçue par l'utilisateur et l'efficacitĂ© du rĂ©seau[9] ;
  • extensibilitĂ© permettant de supporter un grand nombre de composants et leurs interactions. Roy Fielding dĂ©crit l'effet de REST sur l'extensibilitĂ© comme suit :

« REST's client–server separation of concerns simplifies component implementation, reduces the complexity of connector semantics, improves the effectiveness of performance tuning, and increases the scalability of pure server components. Layered system constraints allow intermediaries—proxies, gateways, and firewalls—to be introduced at various points in the communication without changing the interfaces between components, thus allowing them to assist in communication translation or improve performance via large-scale, shared caching. REST enables intermediate processing by constraining messages to be self-descriptive: interaction is stateless between requests, standard methods and media types are used to indicate semantics and exchange information, and responses explicitly indicate cacheability. »

— Roy Fielding, Architectural Styles and the Design of Network-based Software Architectures[3].

« La sĂ©paration des prĂ©occupations client–serveur simplifie l'implĂ©mentation des composants, rĂ©duit la complexitĂ© de la sĂ©mantique des connecteurs, amĂ©liore l'efficacitĂ© de l'optimisation des performances et augmente l'extensibilitĂ© des composants purement serveurs. La contrainte d'architecture en couches permet aux intermĂ©diaires — serveurs mandataires, passerelles et pare-feu — d'ĂȘtre introduits Ă  diffĂ©rents niveaux dans la communication sans changer les interfaces entre les composants, leur permettant ainsi d'intervenir dans la traduction des communications ou d'amĂ©liorer les performances via des systĂšmes de cache Ă  grande Ă©chelle. REST permet les traitements intermĂ©diaires en forçant des messages auto-descriptifs : l'interaction est sans Ă©tat entre les requĂȘtes, les mĂ©thodes standard et les types de mĂ©dia sont utilisĂ©s pour indiquer la sĂ©mantique et Ă©changer l'information, et les rĂ©ponses indiquent explicitement la possibilitĂ© de la mise en cache. »

— Architectural Styles and the Design of Network-based Software Architectures[3].

  • simplicitĂ© d'une interface uniforme ;
  • Ă©volutivitĂ© des composants pour rĂ©pondre aux besoins (mĂȘme lorsque l'application est en cours de fonctionnement) ;
  • visibilitĂ© des communications entre les composants par des agents de service ;
  • portabilitĂ© des composants en dĂ©plaçant le code avec les donnĂ©es ;
  • fiabilitĂ© dans la rĂ©sistance aux pannes du systĂšme en cas de pannes des composants, des connecteurs ou des donnĂ©es[9].

Appliqué aux services web

Les API REST basées sur HTTP sont définies par[8] :

  • un URI de base, comme http://api.example.com/collection/ ;
  • des mĂ©thodes HTTP standards (par ex. : GET, POST, PUT, PATCH et DELETE) ;
  • un type de mĂ©dias pour les donnĂ©es permettant une transition d'Ă©tat (par ex. : Atom, microformats, application/vnd.collection+json, etc.). La nature hypermĂ©dia de l'application permet d'accĂ©der aux Ă©tats suivants de l'application par inspection de la reprĂ©sentation courante. Cela peut ĂȘtre aussi simple qu'un URI ou aussi complexe qu'un applet Java.

Relation entre URI et méthodes HTTP

Le tableau suivant affiche comment les méthodes HTTP sont généralement utilisées dans une API REST :

MĂ©thodes HTTP
URIGETPOSTPUTPATCHDELETE
Ressource collection, telle que http://api.exemple.com/collection/ RĂ©cupĂšre les URI des ressources membres de la ressource collection dans le corps de la rĂ©ponse. CrĂ©e une ressource membre dans la ressource collection en utilisant les instructions du corps de la requĂȘte. L'URI de la ressource membre crĂ©Ă©e est attribuĂ© automatiquement et retournĂ© dans le champ d'en-tĂȘte Location de la rĂ©ponse. Remplace toutes les reprĂ©sentations des ressources membres de la ressource collection par la reprĂ©sentation dans le corps de la requĂȘte, ou crĂ©e la ressource collection si elle n'existe pas. Met Ă  jour toutes les reprĂ©sentations des ressources membres de la ressource collection en utilisant les instructions du corps de la requĂȘte, ou crĂ©e Ă©ventuellement la ressource collection si elle n'existe pas. Supprime toutes les reprĂ©sentations des ressources membres de la ressource collection.
Ressource membre, telle que http://api.exemple.com/collection/item3 RĂ©cupĂšre une reprĂ©sentation de la ressource membre dans le corps de la rĂ©ponse. CrĂ©e une ressource membre dans la ressource membre en utilisant les instructions du corps de la requĂȘte. L'URI de la ressource membre crĂ©Ă©e est attribuĂ© automatiquement et retournĂ© dans le champ d'en-tĂȘte Location de la rĂ©ponse. Remplace toutes les reprĂ©sentations de la ressource membre, ou crĂ©e la ressource membre si elle n'existe pas, par la reprĂ©sentation dans le corps de la requĂȘte. Met Ă  jour toutes les reprĂ©sentations de la ressource membre, ou crĂ©e Ă©ventuellement la ressource membre si elle n'existe pas, en utilisant les instructions du corps de la requĂȘte. Supprime toutes les reprĂ©sentations de la ressource membre.

La mĂ©thode GET est sĂ»re, c'est-Ă -dire que l'appliquer sur une ressource ne rĂ©sulte pas en un changement d'Ă©tat de la ressource (sĂ©mantique de lecture seule)[10]. Les mĂ©thodes GET, PUT et DELETE sont idempotentes, c'est-Ă -dire que les appliquer plusieurs fois sur une ressource rĂ©sulte en le mĂȘme changement d'Ă©tat de la ressource que les appliquer une seule fois, bien que la rĂ©ponse puisse diffĂ©rer[11]. Les mĂ©thodes GET et POST sont stockables en cache, c'est-Ă -dire que le stockage des rĂ©ponses Ă  ces requĂȘtes pour une future rĂ©utilisation est autorisĂ©[12].

Contrairement aux services web orientés SOAP, il n'y a pas de norme officielle pour les API REST[13], parce que REST est une architecture alors que SOAP est un protocole. REST n'est pas une norme en soi, mais les implémentations qui suivent cette architecture utilisent des normes comme HTTP, URI, JSON et XML[13].

Bibliographie

  • RESTful Web Services, par Leonard Richardson et Sam Ruby, est un ouvrage en anglais sorti en . Celui-ci a popularisĂ© le style d’architecture REST[14].
  • Building Hypermedia APIs with HTML5 and Node, par Mike Amundsen, sorti en [15].
  • REST in Practice, par Jim Webber, Savas Parastatidis, Ian Robinson, sorti en [16].
  • REST API Design Rulebook, Designing Consistent RESTful Web Service Interfaces, par Mark Masse, sorti en [17].

Voir aussi

Articles connexes

Liens externes

Notes et références

  1. (en) « Web Services Architecture », sur W3, (consulté le )
  2. (en) « Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content », sur Internet Engineering Task Force (IETF), (consulté le )
  3. (en) Roy Thomas Fielding, Architectural Styles and the Design of Network-based Software Architectures, Irvine, université de Californie à Irvine, , 162 p. (lire en ligne), chap. 5 (« Representational State Transfer (REST) »)
  4. « ThÚse de Roy T. Fielding - Traduction du Chapitre 5 : REST », sur Opikanoba, (consulté le )
  5. (en) « Fielding discute de la définition du terme REST », sur Yahoo, (consulté le )
  6. (en) « Discussion sur le développement de REST » [archive du ], sur Yahoo, (consulté le )
  7. (en) Thomas Erl, Benjamin Carlyle, Cesare Pautasso et Raj Balasubramanian, SOA with REST : Principles, Patterns & Constraints for Building Enterprise Solutions with REST, Upper Saddle River, New Jersey, Prentice Hall, , 624 p. (ISBN 978-0-13-701251-0), chap. 5.1
  8. (en) Leonard Richardson et Sam Ruby, RESTful Web Services, Sebastopol, Californie, O'Reilly Media, , 446 p. (ISBN 978-0-596-52926-0, lire en ligne)
  9. (en) Roy Thomas Fielding, Architectural Styles and the Design of Network-based Software Architectures, Irvine, université de Californie à Irvine, , 162 p. (lire en ligne), chap. 2 (« Network-based Application Architectures »)
  10. (en) « Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content », sur Internet Engineering Task Force (IETF), (consulté le )
  11. (en) « Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content », sur Internet Engineering Task Force (IETF), (consulté le )
  12. (en) « Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content », sur Internet Engineering Task Force (IETF), (consulté le )
  13. (en) « Learn REST: A Tutorial », sur Elkstein, (consulté le )
  14. (en) Leonard Richardson et Sam Ruby, RESTful Web Services, O'Reilly Media, , 454 p. (ISBN 978-0-596-52926-0, lire en ligne)
  15. (en) Mike Amundsen, Building Hypermedia APIs with HTML5 and Node, O'Reilly Media, , 244 p. (ISBN 978-1-4493-0657-1, lire en ligne)
  16. (en) Jim Webber, Savas Parastatidis et Ian Robinson, REST in Practice : Hypermedia and Systems Architecture, O'Reilly Media, , 448 p. (ISBN 978-0-596-80582-1, lire en ligne)
  17. (en) Mark Masse, REST API Design Rulebook, O'Reilly Media, , 116 p. (ISBN 978-1-4493-1050-9, lire en ligne)
Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.