Skip to content

Commit a008195

Browse files
committed
new article: APIs REST
1 parent c219611 commit a008195

File tree

2 files changed

+148
-0
lines changed

2 files changed

+148
-0
lines changed
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
---
2+
layout: post
3+
title: Créer une API REST
4+
author: brianclozel
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-15-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+
En cas de doute, il est souvent utile de se référer à une API REST très
117+
utilisée et reconnue: l'[API github](http://developer.github.com/) est considérée comme une des
118+
meilleures à ce jour.
119+
120+
Aussi, je vous recommande la lecture des articles de Steve Klabnik:
121+
122+
* ["nobody understands REST or
123+
HTTP"](http://blog.steveklabnik.com/2011/07/03/nobody-understands-rest-or-http.html)
124+
* ["some people understand REST and
125+
HTTP"](http://blog.steveklabnik.com/2011/08/07/some-people-understand-rest-and-http.html)
126+
127+
128+
## Bibliographie
129+
130+
Quelques ressources utiles:
131+
132+
* documenter son API REST avec
133+
[jax-doclets](http://www.lunatech-labs.com/open-source/jax-doclets)
134+
* tester son API REST depuis son navigateur avec une [extension Chrome](https://chrome.google.com/webstore/detail/cokgbflfommojglbmbpenpphppikmonn) ou
135+
avec CURL!
136+
* Google a beaucoup travaillé sur les aspects RDF/atomPUB avec
137+
[Gdata](http://code.google.com/intl/fr-FR/apis/gdata/)
138+
* le projet Jersey a de [nombreux exemples d'APIs
139+
REST](http://download.java.net/maven/2/com/sun/jersey/samples/jersey-samples/)
140+
sur des aspects particuliers
141+
* Mettre en place un ["rate
142+
limiting"](http://stackoverflow.com/questions/667508/whats-a-good-rate-limiting-algorithm)
143+
sur son API peut aussi bénéficier d'un cache distribué (memcached,
144+
redis...)
145+
* Selon la plate-forme cible, [le format
146+
JSON](http://jersey.httpjava.net/nonav/documentation/latest/json.html#d4e955) peut être légèrement
147+
différent.
148+
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