HTTP 409 Conflict

Une collision d'état : la requête est valide, mais la ressource a changé d'une manière qui rend impossible son application pour le moment.

Ce que signifie HTTP 409

HTTP 409 Conflict signifie que le serveur a compris la requête mais ne peut pas l'appliquer car elle contredit l'état actuel de la ressource cible. L'exemple classique est une collision d'édition : deux clients ont chargé le même document, tous deux ont enregistré, et le second enregistrement écraserait silencieusement le premier.

Contrairement à 400, la requête elle-même est bien formée — la renvoyer inchangée peut même réussir plus tard. Le corps de la réponse doit expliquer ce qui entre en conflit afin que le client (ou l'utilisateur) puisse le résoudre et réessayer.

Causes courantes des erreurs 409

  • Une collision d'édition : la ressource a été modifiée par quelqu'un d'autre depuis la dernière récupération par le client (souvent visible via ETag / If-Match).
  • La création d'une ressource qui existe déjà — nom d'utilisateur, e-mail, slug ou nom de fichier en double.
  • Une incohérence de version dans l'optimistic locking : le numéro de version soumis est obsolète.
  • La suppression ou le déplacement d'une ressource ayant des dépendances que le serveur refuse de rendre orphelines.
  • Des étapes de workflow concurrentes appliquées dans le désordre (par exemple, approuver une commande déjà annulée).

Comment la corriger en tant que développeur

  • Lisez le corps de la réponse — une bonne API indique le champ en conflit ou la version actuelle attendue.
  • Récupérez à nouveau la ressource, réappliquez votre modification sur l'état actualisé, puis renvoyez la requête.
  • Utilisez des requêtes conditionnelles (If-Match avec des ETags) afin que les conflits soient détectés de manière fiable au lieu d'écraser les données.
  • Pour les conflits de création en doublon, décidez de l'idempotence à l'avance : renvoyez la ressource existante, ou 409 avec un lien vers celle-ci.

Exemple de réponse

HTTP/1.1 409 Conflict
Content-Type: application/json

{"error":"conflict","message":"document was modified by another user","current_version":42}

FAQ

Quelle est la différence entre 409 et 400 ?

400 signifie que la requête elle-même est mal formée ou invalide. 409 signifie que la requête est correcte, mais qu'elle entre en conflit avec l'état actuel de la ressource — réessayer après résolution du conflit peut réussir.

Quand une API doit-elle renvoyer 409 plutôt que 422 ?

Utilisez 422 pour les échecs de validation à l'intérieur du payload et 409 pour les collisions avec l'état existant côté serveur, comme les doublons ou les versions obsolètes.

Comment les ETags aident-ils à éviter les erreurs 409 ?

Le client envoie If-Match avec le dernier ETag vu ; le serveur applique la modification uniquement si la ressource n'a pas changé, sinon il renvoie 409 (ou 412) au lieu d'écraser les données.