# 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](https://jsonplaceholder.typicode.com), une fausse API de blog : essayez-les avec `curl -i` !

<p class="callout info">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.</p>

### Les verbes à connaître

<table id="bkmrk-verber%C3%B4leexemplebody"><thead><tr><th>Verbe</th><th>Rôle</th><th>Exemple</th><th>Body</th></tr></thead><tbody><tr><td>`GET`</td><td>Lire</td><td>`GET /posts`</td><td>Non</td></tr><tr><td>`POST`</td><td>Créer dans une collection, ou déclencher un traitement</td><td>`POST /posts`</td><td>Oui</td></tr><tr><td>`PUT`</td><td>Remplacer entièrement (ou créer à une URI connue)</td><td>`PUT /posts/1`</td><td>Oui</td></tr><tr><td>`PATCH`</td><td>Modifier partiellement</td><td>`PATCH /posts/1`</td><td>Oui</td></tr><tr><td>`DELETE`</td><td>Supprimer</td><td>`DELETE /posts/1`</td><td>Non</td></tr><tr><td>`HEAD`</td><td>Comme GET, mais seulement les headers</td><td>`HEAD /posts`</td><td>Non</td></tr><tr><td>`OPTIONS`</td><td>Lister les méthodes autorisées</td><td>`OPTIONS /posts/1`</td><td>Non</td></tr></tbody></table>

```bash
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
```

<p class="callout info">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).</p>

### 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é.

<table id="bkmrk-verbes%C3%BBridempotent-g"><thead><tr><th>Verbe</th><th>Sûr</th><th>Réexécutable</th></tr></thead><tbody><tr><td>`GET`, `HEAD`, `OPTIONS`</td><td>✅</td><td>✅</td></tr><tr><td>`PUT`</td><td>❌</td><td>✅</td></tr><tr><td>`DELETE`</td><td>❌</td><td>✅</td></tr><tr><td>`POST`</td><td>❌</td><td>❌</td></tr><tr><td>`PATCH`</td><td>❌</td><td>❌ (pas garanti)</td></tr></tbody></table>

<p class="callout success">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é.</p>

<p class="callout info">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.</p>

### PUT ou PATCH ?

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

```bash
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.

```bash
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

<p class="callout warning">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.</p>

```text
❌ 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](https://www.lemondeinformatique.fr/actualites/lire-retour-au-stand-pour-google-web-accelerator-8289.html)