Académique Documents
Professionnel Documents
Culture Documents
HATEOAS
YoruNoHikage
07 avril 2016
2 Les contraintes
3 Les contraintes
11
13
6 Niveau 0
15
17
19
21
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
23
11Conclusion
25
1 Introduction
*[REST] : Representational State Transfer
REST est un style darchitecture dfini dans la thse de Roy Fielding dans les annes 2000, ce
nest donc ni un protocole ni un format. Les implmentations sont donc multiples et diffrentes.
Cependant, on retrouve souvent le principe dans les API HTTP, comme cest le cas de GitHub et
Twitter par exemple.
Lanons-nous pieds joints dans un monde merveilleux !
2 Les contraintes
[REST] : Representational State Transfer [HATEOAS] : Hypermedia As The Engine Of Application State
Lauteur dfinit un certain nombre de contraintes respecter afin de devenir REST Compliant
autrement dit comment se conformer cette architecture. On dit de REST quil est sans tat.
3 Les contraintes
1. Le serveur et le client sont indpendants. Linterface utilisateur est situ ct client (une
application mobile par exemple) et le stockage est situe ct serveur (une base de donnes).
2. Contrairement laccs web classique, aucune variable de session ou autre tat volatile ne
doit tre enregistr ct serveur. Chaque requte vers le serveur est donc indpendante.
3. Mise en cache : le serveur indique au client sil peut mettre en cache les donnes quil reoit.
Cela permet dviter des requtes inutiles et ainsi prserver la bande passante.
4. Une interface uniforme.
1. On accde chaque ressource de faon unique. Il ny a quune seule faon dy accder.
2. Les ressources sont manipules via des reprsentations dfinies, elles sont accompagnes de donnes permettant sa comprhension (vous comprendrez mieux dans
lexemple).
3. Auto-description. Lencodage, par exemple, est prcis de faon claire ainsi le client
peut comprendre le document et appeler le service correspondant cet encodage.
4. Hypermdia comme moteur dapplication (HATEOAS) : la ressource indique comment
accder aux tats suivants (suppression, dition etc), le client peut ainsi connatre
quelles actions sont possibles sur la ressource en lobtenant
5. Hirarchie par couche : les ressources sont individuelles. On peut imaginer que nos ressources embarquent des ressources provenant de serveurs distants ou de mise en cache
par des serveurs intermdiaires.
6. (Facultatif) Excution de scripts ct client obtenus par le serveur. Cela permet de rendre
le client plus lger et plus gnrique.
[[question]] | Quest-ce que a veut dire tout a concrtement ?
Reprenons ces contraintes avec un lexemple de lAPI de Twitter et vulgarisons son utilisation :
1. Lapplication Twitter de votre tlphone correspond un client. Elle est indpendante des
serveurs de Twitter. Vous pouvez naviguer sur votre application, les requtes sont envoyes
et les rponses sont traites par le client afin dtre affiches.
2. Lorsque vous postez un tweet, toutes les informations envoyes permettent de vous identifier. Dans le cadre de Twitter, lauthentification se fait par lintermdiaire dune cl dAPI.
3. Les tweets sont gards sur lapplication jusqu ce que le cache soit vid.
4. 1. Laccs au tweet se fait via lURI : /statuses/show.json ?id=210462857140252672
2. Le tweet est encapsul dans un nuage de mta-donnes, il ny a pas que la ressource
3. La langue du tweet est prcise.
4. Twitter ne suit pas REST la lettre et nintgre pas de lien hypermedia, cest pour cela
que son API est documente. Cet exemple sera illustr dans la dernire partie de ce
tutoriel.
3 Les contraintes
5. Le fonctionnement de ce point est plus interne, on ne peut donc pas savoir mais Twitter
doit srement faire de la mise en cache et du load-balancing.
6. Aucun exemple ne me vient en tte. (Si quelquun connat une API qui fait a, je serai ravi
de la partager)
10
Figure 4.1 Le modle de maturit de Richardson mis en image par Martin Fowler
Les principes de REST ne sont pas toujours respects mais lorsque lon compare la thorie la
pratique, il faut savoir faire quelques concessions et vous serez srement amens faire des choix
divergeant des standards.
11
13
6 Niveau 0
Je souhaite donc prendre un rendez-vous le 21 octobre 2015 avec le mdecin Doc. Il sagit dans
ce niveau dinterroger le serveur partir dun seul point dentre. On spcifie les actions ou les
ressources rcuprer dans lobjet que lon envoie.
HTTP/1.1 200 OK
Content-Type: application/json
...
{
"creneaux": [
{
"debut": "14h00",
"fin": "14h50",
"medecin": { "id": "doc", "autre_propriete": "valeur" }
},
{
"debut": "16h00",
"fin": "16h50",
"medecin": { "id": "doc", "autre_propriete": "valeur" }
}
]
}
[[information]] | Je simplifie en mettant les dates/heures en chane de caractre, on ne va pas
sembter avec des dates | rallonge Maintenant que lon connat les crneaux libres, on veut
pouvoir le rserver ! On renvoie une requte au serveur avec laction effectuer et les informations
dont il a besoin.
15
6 Niveau 0
HTTP/1.1 200 OK
Content-Type: application/json
...
{
"RDV": {
"creneau": ...,
"patient": ...
}
}
Et sinon jobtiens une rponse ngative :
HTTP/1.1 200 OK
Content-Type: application/json
...
{
"RDVImpossible": {
"creneau": ...,
"patient": ...,
"erreur": "Ce crneau n'est pas disponible"
}
}
Vous commencez dj voir ce qui cloche nest-ce pas ? ~Non ? Le 200 OK pour une erreur, bizarre,
non ?~
Voyons comment slever vers la gloire de REST et ainsi amliorer notre architecture !
16
{
"creneaux" : [
{
"id" : "1337",
...
},
{
"id" : "1645",
...
}
]
}
On a plus qu choisir notre crneau et le rserver directement :
17
Comme vous pouvez le constater, le corps de la requte est vide et les infos sont passs en arguments. Gnralement dans les APIs (mais pas toujours), les paramtres servent de filtres (tri,
pagination). Ici on rcupre uniquement les crneaux ouverts le 21 octobre 2015. La rponse,
quant elle, ne change en rien et elle ne changera pas tant que la ressource ne sera pas modifie
(premire rgle de GET).
Maintenant, on veut rserver le crneau. L encore, la requte ne change pas et cest bien un POST
que lon utilise.
[[information]] | Le fait dutiliser POST ou PUT afin de crer et/ou de mettre jour une ressource est sujet dbat. Mais | comme le pointe cette rponse, le standard veut que POST soit
utilis | lorsque lon envoie une nouvelle sous-ressource ne connaissant pas son URI et PUT
linverse, la | ressource tant modifie si elle existe dj ! | Pour prendre un exemple, ceci POST
19
lembarquer dans le corps de la rponse en supplment afin dviter une nouvelle requte pour
le client.
[[question]] | Mais si quelquun rserve en mme temps ? On fait quoi ?
Eh bien, on le dit tout simplement : Attention, il y a un conflit sur ce crneau, il est dj pris ! Ce
qui donne ceci dans la rponse :
20
<creneaux>
<creneau>
<id>1337</id>
...
<link rel="self" href="http://api.example.com/creneaux/1337" />
<link rel="rdv" href="http://api.example.com/creneaux/1337/rdv" />
</creneau>
<creneau>
<id>1645</id>
...
<link rel="self" href="http://api.example.com/creneaux/1645" />
<link rel="rdv" href="http://api.example.com/creneaux/1645/rdv" />
21
</creneau>
22
Message
Signification
200
OK
201
Created
POST.
Rponse un POST qui cre une ressource. Doit tre
obligatoirement accompagn du header Location avec le
lien vers la nouvelle ressource. On peut embarquer la
nouvelle ressource pour viter au client de refaire une
nouvelle requte.
204
No Content
304
Not Modified
400
Bad Request
401
Unauthorized
Forbidden
404
405
410
Not Found
Method Not
Allowed
lutilisateur.
Gone
415
Unsupported Media
Type
422
Unprocessable
429
500
Internal Error
Entity
Service Unavailable
23
11 Conclusion
Voil, maintenant que vous avez tout compris sur REST, vous allez pouvoir bien structurer votre
application ! Ce tuto ne concernait pas vraiment la mise en application au niveau code, mais il
est toujours intressant de savoir comment les choses sont faites et dcrites afin de pouvoir les
respecter par la suite.
Sources :
REST sur Wikipdia
http ://blog.xebia.fr/2010/06/25/rest-richardson-maturity-model/
http ://martinfowler.com/articles/richardsonMaturityModel.html
http ://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
REST APIs with Symfony2 : The Right Way - William Durand
Best Practices for Designing a Pragmatic RESTful API - Vinay Sahni
Merci Dominus Carnufex pour les corrections.
25