Agilité, Développement Java, Nouvelles technologies et plus…
  • rss
  • Accueil
  • Management
  • Programmation agile
  • Technologie
  • Linux
  • Evénement
  • App Android
  • Contact
  • A propos de l'auteur
  • English
  • Francais

Faire du REST social avec HATEOAS

Fabian Piau | mercredi 2 juillet 2014 - 19:06
  • Imprimer
  • Twitter
  • LinkedIn
  • Facebook
  • Pocket

 English version available

L’article « API, REST, JSON, XML, HTTP, URI… Vous parlez quelle langue en fait? » exposait quelques principes sur les webservices et les technologies associées, en particulier REST. Maintenant que vous êtes incollable sur le sujet, continuons un peu et introduisons HATEOAS. Bien que le nom soit un peu barbare, il n’y a aucun rapport avec un quelconque personnage du seigneur des anneaux!

Reprenons l’exemple du trajet en train du premier article. Notez que tous les exemples qui suivent sont en JSON, mais l’utilisation du XML est tout à fait possible.

{
  "trainNum": 123456789,
  "departure": {"station": "Bruxelles-Central", "time": "07:28"},
  "arrival": {"station": "Liège-Guillemins", "time": "08:25"}
}

Ce message décrit un trajet en train en donnant diverses informations telles que le numéro du train, les gares de départ et d’arrivée et les horaires. Par contre, il n’y a aucune information liée au contexte. En se basant uniquement sur le contenu de ce message, on ne peut pas deviner sa provenance ou le moyen pour obtenir davantage d’informations (sur le trajet, le train, etc.). C’est le moment où notre cher compagnon HATEOAS intervient.

REST social

HATEOAS est l’acronyme de Hypermedia as the Engine of Application State. Tout de suite, c’est plus clair! Non? Ok, moi non plus. Concrètement, c’est un moyen d’ajouter des informations contextuelles à un message. On parle de la « contrainte » HATEOAS sur REST car le but est que ces données ajoutées respectent un format bien défini et universel. Ce standard (comme tous les autres) est indispensable afin d’éviter que chacun crée son propre format maison et que cela devienne spécifique par API. On perdrait alors en intérêt et en compréhension.

Dans le cas de mon trajet, il serait intéressant d’avoir les coordonnées du train suivant et précédent. Pour obtenir ce lien entre les trajets et respecter la contrainte HATEOAS, le message devient:

{
  "numTrain": 123456789,
  "departure": {"station": "Bruxelles-Central", "time": "07:28"},
  "arrival": {"station": "Liège-Guillemins", "time": "08:23"},
  "_links": {
    "self": {
      "href": "http://www.triptrain.com/displayTrip?numTrain=123456789&departureStation=Bruxelles-Central&departureTime=07:28"
    },
    "nextTrain": {
      "href": "http://www.triptrain.com/displayTrip?numTrain=987654321&departureStation=Bruxelles-Central&departureTime=08:01"
    },
    "previousTrain": {
      "href": "http://www.triptrain.com/displayTrip?numTrain=147258369&departureStation=Bruxelles-Central&departureTime=07:01"
    }
  }
}

Le bloc de données existant reste inchangé et un bloc de liens a fait son apparition. Les webservices en REST peuvent donc être adaptés sans avoir besoin de toucher à l’existant, le risque de régression est ainsi minimisé.

Le message a maintenant un sens beaucoup plus fonctionnel. A partir d’un trajet, je suis capable de passer au suivant ou au précédent. Je dois avouer que l’exemple est peut-être un peu limité, mais imaginez le principe dans d’autres contextes.

D’une certaine manière, l’API s’auto-découvre et le message s’auto-décrit. La réponse à une requête permet d’en faire une autre sans forcément connaitre à l’avance toutes les méthodes disponibles sur l’API. HATEOAS améliore grandement la lisibilité de vos API, mais l’intérêt devient réel lorsque les consommateurs du webservice utilisent ces nouvelles informations.

Il y a cependant un revers à la médaille: HATEOAS est relativement jeune et la spécification n’est pas clairement définie. D’ailleurs où est-elle? D’autres personnes se sont posé cette question, il semblerait que vous pouvez la trouver ici: HAL – Hypertext Application Language specification. Il y a aussi cette page bien plus lisible et sur laquelle vous trouverez plusieurs liens intéressants dans la partie « Quick links ». Je vous conseille leur lecture si vous souhaitez approfondir le sujet.

Articles similaires

webservicesAPI, REST, JSON, XML, HTTP, URI… Vous parlez quelle langue en fait? devoxxDevoxx UK 2018 – Jour 2 Maven sitePlus loin avec le Maven Site kubernetesFlagger – Premiers pas avec Istio et Kubernetes
Catégories
Programmation agile
Tags
api, HATEOAS, json, rest, webservice
Flux rss des commentaires
Flux rss des commentaires

« API, REST, JSON, XML, HTTP, URI… Vous parlez quelle langue en fait? Etes-vous esclave de votre smartphone? »

Télécharger l'app CarmaBlog

Flux RSS

  • Flux RSS RSS - Articles
  • Flux RSS RSS - Commentaires

Articles les plus vus

  • Changer la langue de Firefox - 115 393 vues
  • Réaliser un sondage en ligne avec Google Forms / Drive / Docs - 62 844 vues
  • FAQ – Sondage en ligne avec Google Forms / Drive / Docs - 51 196 vues
  • Personnaliser Gnome 3 (Shell) - 29 770 vues
  • La signification d’URL, URI et URN - 16 890 vues
  • Java EE & CDI vs. Spring - 15 261 vues
  • Open Street Map, une meilleure carte que Google Maps? - 14 418 vues
  • Comparaison NoSQL: Couchbase et MongoDB - 13 929 vues
  • Firefox Nightly, Aurora, Beta, Desktop, Mobile, ESR & Co. - 12 983 vues
  • API, REST, JSON, XML, HTTP, URI… Vous parlez quelle langue en fait? - 12 461 vues

Commentaires récents

  • Fabian Piau sur FAQ – Sondage en ligne avec Google Forms / Drive / DocsProbablement mais ces options sont en général paya…
  • Pauline sur FAQ – Sondage en ligne avec Google Forms / Drive / DocsBonjour Fabian, Merci de votre retour, oui j'avais…
  • Fabian Piau sur FAQ – Sondage en ligne avec Google Forms / Drive / DocsBonjour Pauline, ce n'est pas possible de créer un…
  • Pauline sur FAQ – Sondage en ligne avec Google Forms / Drive / DocsBonjour, Je suis en train de créer un Google Forms…
  • Fabian Piau sur FAQ – Sondage en ligne avec Google Forms / Drive / DocsBonjour, il n'y a pas de durée limitée pour un son…

Articles récents

  • Attaques de robots: vous n’êtes pas seul… - Il y a 1 an et 3 mois
  • Flagger – Monitorer vos déploiements Canary avec Grafana - Il y a 2 ans et 1 mois
  • Flagger – Déploiements Canary sur Kubernetes - Il y a 2 ans et 2 mois
  • Flagger – Premiers pas avec Istio et Kubernetes - Il y a 2 ans et 3 mois
  • CoderDojo Expedia à Londres - Il y a 3 ans et 3 semaines
  • Etre bénévole à Devoxx4Kids - Il y a 3 ans et 3 mois
  • Une migration Java 11 réussie - Il y a 3 ans et 7 mois
  • Conseils pour sécuriser votre site WordPress - Il y a 3 ans et 10 mois
  • Devoxx UK 2018 – Jour 2 - Il y a 4 ans et 2 mois
  • Devoxx UK 2018 – Jour 1 - Il y a 4 ans et 2 mois
  • Wise, Revolut et Monzo, une petite révolution dans le monde des expatriés et voyageurs - Il y a 4 ans et 6 mois
  • Autocomplétion pour Git - Il y a 5 ans et 2 mois
  • Swagger, la documentation API automatisée - Il y a 5 ans et 5 mois
  • Architecture Microservices – Les bonnes pratiques - Il y a 5 ans et 10 mois
  • FAQ – Sondage en ligne avec Google Forms / Drive / Docs - Il y a 6 ans et 3 mois
Offre moi un café

Langue

  • Français
  • English

Suivez-moi!

Suivez-moi sur Linkedin
Suivez-moi sur Twitter
Suivez-moi sur Stackoverflow
Suivez-moi sur Github
Suivez-moi sur Rss
Link to my Contact

Abonnement email

Saisissez votre adresse email pour être informé des nouveaux articles.

Étiquettes

.net agile agilité android bash blog bonnes pratiques cache cloud conférence css devoxx docker développeur eclipse extreme programming firefox flagger google helm hibernate informatique intégration continue istio java jug kubernetes londres mobilité informatique métier outil panorama partage performance plugin programmeur script société spring sécurité tdd test ubuntu windows wordpress

Liens

  • Blog Ippon Technologies
  • Blog Publicis Sapient
  • Blog Zenika
  • Classpert
  • CommitStrip
  • Coursera
  • Le Touilleur Express
  • Les Cast Codeurs Podcast
  • OCTO talks !
  • The Twelve-Factor App

Catégories

  • Evénement (15)
  • Linux (3)
  • Management (7)
  • Programmation agile (29)
  • Technologie (45)

Archives

  • avril 2021 (1)
  • juin 2020 (1)
  • mai 2020 (2)
  • juillet 2019 (1)
  • mai 2019 (1)
  • décembre 2018 (1)
  • octobre 2018 (1)
  • juin 2018 (1)
  • mai 2018 (1)
  • janvier 2018 (1)
  • mai 2017 (1)
  • mars 2017 (1)
  • octobre 2016 (1)
  • avril 2016 (2)
  • mars 2016 (1)
  • novembre 2015 (1)
  • mai 2015 (1)
  • février 2015 (1)
  • décembre 2014 (1)
  • novembre 2014 (1)
  • septembre 2014 (2)
  • août 2014 (1)
  • juillet 2014 (2)
  • juin 2014 (1)
  • avril 2014 (1)
  • mars 2014 (1)
  • février 2014 (2)
  • janvier 2014 (1)
  • décembre 2013 (1)
  • novembre 2013 (1)
  • octobre 2013 (3)
  • septembre 2013 (5)
  • juillet 2013 (1)
  • juin 2013 (1)
  • mai 2013 (1)
  • avril 2013 (1)
  • mars 2013 (2)
  • février 2013 (1)
  • janvier 2013 (2)
  • décembre 2012 (2)
  • octobre 2012 (1)
  • septembre 2012 (1)
  • juillet 2012 (1)
  • mai 2012 (1)
  • avril 2012 (1)
  • mars 2012 (1)
  • février 2012 (1)
  • janvier 2012 (2)
  • décembre 2011 (1)
  • novembre 2011 (2)
  • octobre 2011 (2)
  • septembre 2011 (1)
  • juillet 2011 (1)
  • juin 2011 (2)
  • avril 2011 (1)
  • mars 2011 (1)
  • février 2011 (1)
  • janvier 2011 (2)
  • novembre 2010 (2)
  • septembre 2010 (1)
  • août 2010 (1)
  • juillet 2010 (1)
  • juin 2010 (1)
  • mai 2010 (1)
  • avril 2010 (1)
  • mars 2010 (1)
  • février 2010 (1)
  • décembre 2009 (1)
  • novembre 2009 (1)
  • octobre 2009 (2)
  • septembre 2009 (2)
  • août 2009 (3)
  • juillet 2009 (1)
  • juin 2009 (2)
Suivez-moi sur Twitter
Suivez-moi sur Linkedin
Suivez-moi sur Stackoverflow
Suivez-moi sur Rss
Link to my Contact
Suivez-moi sur Github
 
Fabian Piau | © 2009 - 2022
Tous droits réservés | Haut ↑