Skip to content

Commit 55fe9a2

Browse files
committed
Merge pull request pullrequest#3 from bclozel/master
nouvel article: "créer des api rest"
2 parents b003aba + 9a2bb70 commit 55fe9a2

File tree

3 files changed

+165
-0
lines changed

3 files changed

+165
-0
lines changed
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
---
2+
layout: post
3+
title: Créer une API REST
4+
author: bclozel
5+
tags: [rest, api]
6+
published: true
7+
---
8+
9+
Les APIs REST sont de plus en plus utilisées:
10+
11+
* avec les webservices dits "techniques" (à usage interne uniquement à
12+
une plate-forme), qui viennent simplifier l'utilisation de services
13+
orientés SOAP.
14+
* avec des APIs orientées "web UI", qui sont utilisées par des
15+
applications full javascript.
16+
* pour des APIs orientées applications mobiles ou utilisation par une
17+
grande variété de développeurs tiers.
18+
19+
Le terme "API REST" est très conceptuel, voire polémique; les concepts
20+
derrière REST ne sont pas suffisants pour répondre à tous vos besoins.
21+
Cet article donne quelques pistes pour la conception et la mise en
22+
oeuvre d'une API de ce type.
23+
24+
Pas besoin de lire [la thèse de Roy
25+
Fielding](http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm) ou
26+
de suivre à la lettre tous les dogmes REST - mais quelques règles
27+
simples ne sont pas à négliger.
28+
29+
## Règle #1: respecter les grands principes REST
30+
31+
GET http://example.org/user/12
32+
33+
Une API REST doit avant tout servir à manipuler des **ressources** (ici,
34+
un utilisateur) avec des verbes (ici, GET). Trop souvent, les
35+
concepteurs d'API ont tendance à inclure des verbes dans les URIs.
36+
37+
L'API Flickr est un bon exemple de pièges à éviter; on retrouve dans les
38+
URIs des noms de méthodes (en fait, cette API est plus proche de RPC que
39+
de REST).
40+
41+
GET http://api.flickr.com/services/rest/?method=flickr.photos.delete&api_key=aaabbbccc&photo_id=12 (API Flickr)
42+
DELETE http://api.flickr.com/photos/12?api_key=aaabbbccc (une idée d'amélioration)
43+
44+
Très souvent, éviter ce piège revient à créer de nouvelles ressources;
45+
un exemple avec une API orientée e-commerce:
46+
47+
GET http://example.org/order/144/pay (payer une commande existante)
48+
49+
En fait, créer une ressource "paiement" peut être une bonne idée, ce qui
50+
permettra de vérifier le status de ce paiement plus tard.
51+
52+
POST http://example.org/payment/?order=144 (création d'un paiement)
53+
GET http://example.org/payment/23 (renvoie les informations sur le paiement)
54+
55+
Des articles entiers traitent du [design
56+
d'URLs](http://warpspire.com/posts/url-design/).
57+
58+
## Règle #2: laisser HTTP faire son travail
59+
60+
HTTP a déjà les fonctionnalités, il est omniprésent et déjà testé.
61+
HTTP, c'est entre autres le content negiciation, le cache de ressources
62+
et le versioning (via Etags ou Cache-control), des codes d'erreurs
63+
explicites... pourquoi le réinventer?
64+
65+
Dans le doute, on pourra toujours revoir les [status
66+
HTTP](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes) et les
67+
[headers HTTP](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields)
68+
pour voir si HTTP est déjà équipé pour un besoin particulier.
69+
70+
71+
## Règle #3: garder une architecture orientée web
72+
73+
Le web est essentiellement:
74+
75+
* stateless. Oubliez les sessions et la sauvegarde d'état entre
76+
différentes requêtes. Si vous voulez épargner votre base de données,
77+
de nombreux systèmes de cache sont adaptés à ce besoin (redis,
78+
memcached, ehcache...).
79+
* oriénté ressources. L'important est de ne pas laisser des conventions
80+
de l'application venir polluer les interactions client/serveur. Cet
81+
item n'est pas facile à qualifier; mais généralement, une API difficile
82+
à documenter est un signe.
83+
84+
85+
## Règle simple: commencer par comprendre les utilisateurs
86+
87+
Avant de commencer la conception des ressources et des URIs, il faut
88+
tout d'abord qualifier ses utilisateurs (qui/quoi va utiliser cette
89+
API?) et quels services nous souhaitons leur rendre.
90+
Définir quelques priorités sur les items suivants permet de concentrer
91+
ses efforts sur les aspects importants pour notre API:
92+
93+
![APIs REST](/public/img/2011-09-21-creer-une-api-rest/api-rest.png)
94+
95+
Ce schéma identifie des zones où répartir ses efforts, selon l'API REST
96+
que l'on souhaite créer. Un exemple avec l'item "usage": si l'API doit
97+
être intégrée dans des sites tiers, il est préférable de concentrer des
98+
efforts sur l'utilisation de [JSONP](http://en.wikipedia.org/wiki/JSONP) ou [CORS](http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing) afin d'éviter les limitations de sécurité des navigateurs web.
99+
100+
## Un dernier mot
101+
102+
Certains problèmes de conception sont récurrents dans les APIs REST, et
103+
les opinions sont souvent bien trop tranchées.
104+
105+
### Le versioning revient souvent dans les préoccupations
106+
107+
* pour identifier différentes versions d'une API, l'utilisation d'un
108+
préfixe est [souvent
109+
recommandé](http://stackoverflow.com/questions/389169/best-practices-for-api-versioning)
110+
* lorsque la composition des ressources varie, l'utilisation du
111+
content-type HTTP personnalisé est la clé (par exemple: `Accept: application/vnd.pullrequest-v2+json`)
112+
* pour le versioning de ressources (suivre les modifications d'une
113+
ressource particulière), l'utilisation des Etags (pour le cache) et/ou
114+
d'un numéro de version dans votre ressource sont suffisants
115+
116+
### Documentation et "découvrabilité"
117+
118+
La documentation est un aspect essentiel d'une API REST. Certains
119+
prennent le parti d'automatiser et d'outiller un maximum la
120+
documentation: par exemple, avec [jax-doclets](http://www.lunatech-labs.com/open-source/jax-doclets).
121+
122+
Pour aller plus loin, les APIs peuvent apporter une "découvrabilité":
123+
permettre au protocole HTTP de documenter l'utilisation de l'API. En
124+
clair, donner au client REST des indications sur les actions possibles
125+
via les headers réponse HTTP. Martin Fowler l'explique bien dans un
126+
article sur le [Richardson Maturity
127+
Model](http://martinfowler.com/articles/richardsonMaturityModel.html).
128+
129+
### En cas de doute...
130+
131+
Il est souvent utile de se référer à une API REST très
132+
utilisée et reconnue: l'[API github](http://developer.github.com/) est considérée comme une des
133+
meilleures à ce jour.
134+
135+
Aussi, je vous recommande la lecture des articles de Steve Klabnik:
136+
137+
* ["nobody understands REST or
138+
HTTP"](http://blog.steveklabnik.com/2011/07/03/nobody-understands-rest-or-http.html)
139+
* ["some people understand REST and
140+
HTTP"](http://blog.steveklabnik.com/2011/08/07/some-people-understand-rest-and-http.html)
141+
142+
143+
## Ressources utiles
144+
145+
* Tester son API REST depuis son navigateur avec une [extension Chrome](https://chrome.google.com/webstore/detail/cokgbflfommojglbmbpenpphppikmonn) ou
146+
avec CURL!
147+
* Google a beaucoup travaillé sur les aspects RDF/atomPUB avec
148+
[Gdata](http://code.google.com/intl/fr-FR/apis/gdata/)
149+
* Le projet Jersey a de [nombreux exemples d'APIs
150+
REST](http://download.java.net/maven/2/com/sun/jersey/samples/jersey-samples/)
151+
sur des aspects particuliers, dont
152+
[Hypermedia](http://download.java.net/maven/2/com/sun/jersey/experimental/hypermedia-action/hypermedia-action-sample/)
153+
* Mettre en place un ["rate
154+
limiting"](http://stackoverflow.com/questions/667508/whats-a-good-rate-limiting-algorithm)
155+
sur son API peut aussi bénéficier d'un cache distribué (memcached,
156+
redis...)
157+
* Selon la plate-forme cible, [le format
158+
JSON](http://jersey.httpjava.net/nonav/documentation/latest/json.html#d4e955) peut être légèrement
159+
différent.
160+

public/css/style.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,10 @@ ul {
299299
border-bottom-color: #480c28;
300300
}
301301

302+
#content img {
303+
border: solid 3px #999;
304+
}
305+
302306
/* ---- Article ---- */
303307

304308
article {
@@ -322,6 +326,7 @@ article pre {
322326
background: #eee;
323327
padding: 1em;
324328
border: solid 1px #999;
329+
margin: 2em 0pt;
325330
}
326331

327332
article p, article ul {
33.2 KB
Loading

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy