Skip to main content

Les verbes HTTP

Les verbes (ou méthodes) HTTP indiquent l'action à effectuer sur la ressource désignée par l'URI.

Tous les exemples de cette page fonctionnent avec JSONPlaceholder, une fausse API de blog : essayez-les avec curl -i !

JSONPlaceholder fait semblant : il répond comme si l'opération avait réussi, mais rien n'est réellement créé ni supprimé. Parfait pour s'entraîner sans rien casser.

Les verbes à connaître

Verbe Rôle Exemple Body
GET Lire GET /posts Non
POST Créer dans une collection, ou déclencher un traitement POST /posts Oui
PUT Remplacer entièrement (ou créer à une URI connue) PUT /posts/1 Oui
PATCH Modifier partiellement PATCH /posts/1 Oui
DELETE Supprimer DELETE /posts/1 Non
HEAD Comme GET, mais seulement les headers HEAD /posts Non
OPTIONS Lister les méthodes autorisées OPTIONS /posts/1 Non
curl -i https://jsonplaceholder.typicode.com/posts/1
curl -i -X DELETE https://jsonplaceholder.typicode.com/posts/1
curl -I https://jsonplaceholder.typicode.com/posts     # -I envoie un HEAD
curl -i -X OPTIONS https://jsonplaceholder.typicode.com/posts/1

En principe, OPTIONS renvoie la liste des méthodes dans le header Allow. JSONPlaceholder la renvoie dans Access-Control-Allow-Methods, un header lié à CORS (voir chapitre 8).

Sûr et réexécutable

  • Sûr (safe) : la requête ne modifie rien sur le serveur. On peut l'envoyer sans risque.
  • Réexécutable : envoyer la requête 1 fois ou 10 fois laisse le serveur dans le même état. On peut la renvoyer sans risque si le réseau a coupé.
Verbe Sûr Réexécutable
GET, HEAD, OPTIONS ✅ ✅
PUT ❌ ✅
DELETE ❌ ✅
POST ❌ ❌
PATCH ❌ ❌ (pas garanti)

Cliquer 3 fois sur « Payer » envoie 3 POST : 3 paiements (et un client furieux).
Supprimer 3 fois l'article 1 avec DELETE, c'est toujours un seul article supprimé.

Réexécutable ne veut pas dire « même réponse » : le premier DELETE renvoie 204, le second peut renvoyer 404. Ce qui compte, c'est l'état du serveur.

PUT ou PATCH ?

PUT remplace toute la ressource : les champs absents sont perdus.

curl -i -X PUT https://jsonplaceholder.typicode.com/posts/1 \
  -H "Content-Type: application/json" \
  -d '{"id": 1, "userId": 1, "title": "Nouveau titre", "body": "Nouveau contenu"}'

PATCH ne modifie que les champs envoyés.

curl -i -X PATCH https://jsonplaceholder.typicode.com/posts/1 \
  -H "Content-Type: application/json" \
  -d '{"title": "Nouveau titre"}'

Avec un PUT qui ne contiendrait que {"title": "Nouveau titre"}, l'article perdrait son contenu.

Ne jamais modifier avec GET

Un GET doit rester sûr. Les navigateurs, les robots d'indexation et les outils de préchargement suivent les liens sans demander la permission.

❌ GET    /api/article/delete?id=1
✅ DELETE /posts/1

En 2005, le Google Web Accelerator préchargeait les liens des pages visitées… y compris les liens « supprimer » de certaines interfaces d'administration.
https://www.lemondeinformatique.fr/actualites/lire-retour-au-stand-pour-google-web-accelerator-8289.html