# Versioning

Une API publiée a des clients que vous ne connaissez pas : des applications mobiles qui ne seront pas mises à jour avant des mois, des scripts oubliés sur un serveur, des intégrations de partenaires… Changer l'API peut tous les casser d'un coup.

### Ce qui casse, ce qui ne casse pas

<table id="bkmrk-%E2%9C%85-compatible-%28pas-de"><thead><tr><th>✅ Compatible (pas de nouvelle version)</th><th>❌ Rupture (*breaking change*)</th></tr></thead><tbody><tr><td>Ajouter une route</td><td>Supprimer ou renommer une route</td></tr><tr><td>Ajouter un champ dans une réponse</td><td>Supprimer ou renommer un champ</td></tr><tr><td>Ajouter un paramètre **facultatif**</td><td>Rendre un paramètre obligatoire</td></tr><tr><td>Ajouter une valeur possible à un filtre</td><td>Changer le type d'un champ (`"9.5"` → `9.5`)</td></tr><tr><td> </td><td>Changer le sens d'un code de statut</td></tr></tbody></table>

<p class="callout info">Côté client, la règle inverse : ignorez les champs que vous ne connaissez pas. Un client qui plante parce qu'un champ a été ajouté est un client mal écrit, même si cela existe parfois.</p>

### Où mettre la version ?

#### Dans l'URL

```text
GET /v1/cocktails
GET /v2/cocktails
```

La solution la plus répandue : visible, simple à tester avec curl, facile à router. C'est le choix d'API-ritif et la méthode recommandée dans ce cours.

#### Dans un header

```http
GET /cocktails
X-API-Version: 2
```

Les URL restent stables, mais la version est invisible dans un navigateur ou un lien. GitHub (`X-GitHub-Api-Version: 2022-11-28`) et Stripe (`Stripe-Version`) utilisent des dates comme numéro de version.

#### Dans le media type

```http
GET /cocktails
Accept: application/vnd.api-ritif.v2+json
```

La plus « REST » selon les puristes, puisque c'est la représentation qui change. La moins pratique au quotidien.

### Faire vivre les versions

- On ne change de version que pour une rupture : `v1`, `v2`… pas de `v1.3.7` dans l'URL.
- On maintient l'ancienne version pendant une période annoncée.
- On prévient les clients, y compris dans les réponses elles-mêmes, avec les headers `Deprecation` (la version est dépréciée) et `Sunset` (date de fin) :

```http
HTTP/1.1 200 OK
Deprecation: @1767225600
Sunset: Wed, 30 Jun 2027 23:59:59 GMT
Link: </v2/cocktails>; rel="successor-version"
```

<p class="callout success">Le meilleur versioning est celui dont on n'a jamais besoin : une API bien conçue dès le départ, et qui n'évolue que par ajouts compatibles, peut vivre des années en `v1`.</p>