POST peut échouer après avoir été
exécutée côté serveur : la mission est créée, mais vous ne recevez jamais la
réponse. Si vous réessayez naïvement, vous créez un doublon.
L’idempotence résout ce problème. En attachant un en-tête Idempotency-Key
à vos requêtes mutantes, vous garantissez que l’opération ne produit son effet
qu’une seule fois, quel que soit le nombre de fois où vous la rejouez.
L’idempotence est le filet de sécurité de la création de mission. Combinée à la
réconciliation par webhook, elle rend votre intégration
robuste face aux pannes transitoires.
En bref
En-tête
Idempotency-Key: <votre-clé> — une chaîne libre que vous générez
(un UUID v4 est idéal).Portée
Les
POST mutants : surtout la création de mission, mais aussi
refacturations, options, annulation, dates.Durée de vie
Une clé est mémorisée 24 h. Au-delà, la même clé est traitée comme neuve.
Rejeu
Une réémission identique renvoie la réponse en cache avec
l’en-tête
Idempotent-Replayed: true.Comment l’utiliser
Générez une clé unique par opération métier
Une clé d’idempotence représente une intention : « créer cette mission-ci ».
Générez une nouvelle clé pour chaque opération distincte — un UUID v4 fait
parfaitement l’affaire.
Attachez-la à la requête mutante
Ajoutez l’en-tête
Idempotency-Key à votre POST (en plus de
X-Api-Key).Exemple : créer une mission de façon sûre
L’en-têteIdempotency-Key est posé une fois ; les deux mêmes appels ne créent
qu’une seule mission.
201 est identique à chaque rejeu :
Sémantique détaillée
Le tableau ci-dessous décrit comment le serveur traite une clé selon le scénario.| Scénario | Comportement |
|---|---|
| Première requête | Exécutée normalement. La réponse (code + corps) est mise en cache, indexée sur la clé. |
| Même clé + même corps | La réponse en cache est rejouée à l’identique, avec l’en-tête Idempotent-Replayed: true. Aucun nouvel effet de bord. |
| Même clé + corps différent | 409 Conflict — la clé a déjà servi pour une autre requête (voir plus bas). |
| Requête concurrente, même clé | 409 Conflict tant que la première requête est encore en cours de traitement. |
Réponse serveur 5xx | Non mise en cache : le verrou est libéré pour qu’un retry puisse réussir. |
Le rejeu : Idempotent-Replayed
Quand le serveur renvoie une réponse en cache, il ajoute l’en-tête de réponse :
Vérifiez
Idempotent-Replayed après chaque retry : sa présence confirme que
votre réémission n’a pas créé de doublon.Conflit de clé : 409
Réutiliser une même clé avec un corps de requête différent est une erreur de
votre côté : la clé identifie une opération précise, elle ne peut pas en désigner
deux. Le serveur répond alors 409 Conflict au format
RFC 9457 (application/problem+json) :
Les erreurs serveur ne sont pas cachées
Une réponse5xx (par exemple 502 Bad Gateway d’un service amont) n’est pas
mémorisée. Le verrou associé à la clé est relâché, ce qui rend le retry sûr :
vous pouvez réémettre la même requête avec la même clé sans risque de doublon ni
de 409 parasite.
Logique de retry recommandée
Quand l’utiliser
L’idempotence protège les opérations qui créent ou modifient un état et dont un doublon aurait des conséquences. Posez systématiquement uneIdempotency-Key
sur :
Création de mission — POST /transports
Création de mission — POST /transports
Le cas d’usage prioritaire. Un doublon créerait deux missions facturables.
C’est ici que l’idempotence apporte le plus de valeur.
Refacturation — POST /transports/{id}/price-adjustments
Refacturation — POST /transports/{id}/price-adjustments
Évite d’appliquer deux fois le même changement de prix lors d’un retry.
Options — POST /transports/{id}/options
Options — POST /transports/{id}/options
Empêche d’ajouter la même option (et de recalculer le prix) en double.
Annulation — POST /transports/{id}/cancel
Annulation — POST /transports/{id}/cancel
Garantit qu’un retry n’enclenche pas une seconde annulation.
Dates — PATCH /transports/{id}/dates
Dates — PATCH /transports/{id}/dates
Évite de réémettre une notification de changement d’horaires au client.
Documents — POST /transports/{id}/documents
Documents — POST /transports/{id}/documents
Empêche l’ajout en double des mêmes pièces jointes à la mission.
Bonnes pratiques
- Une clé par intention métier. Générez la clé avant le premier envoi et conservez-la pour tous les retries de cette même opération. Ne réutilisez jamais une clé pour une opération différente.
- Persistez la clé côté client (file d’attente, base) jusqu’à obtenir une réponse définitive, afin de pouvoir rejouer après un crash de votre processus.
- Branchez votre logique sur le code HTTP (
status), pas sur le texte dedetailqui peut évoluer. - TTL 24 h : une clé expirée n’offre plus de protection. Une opération reprise au-delà de 24 h sera traitée comme nouvelle — utilisez une clé fraîche.
Étapes suivantes
Démarrage rapide
Créez votre première mission de bout en bout, avec idempotence.
Format des erreurs
Comprenez les réponses
409, 422 et 5xx (RFC 9457).Webhooks
Réconciliez les événements manqués et déduplisez côté consommateur.
