Skip to main content
Chaque échec est un objet JSON avec un unique message. Le statut HTTP est la partie lisible par la machine ; la chaîne est pour une personne lisant un log.

L’ordre des vérifications

Il décide quelle erreur vous voyez quand une requête est mauvaise à plus d’un titre, et c’est la raison pour laquelle une charge utile malformée peut revenir comme un problème d’authentification.
1

Authentification

Avant que le corps ne soit parsé.
2

Autorisation

Liste d’IP autorisées, puis type de login.
3

Négociation de contenu

L’en-tête Accept.
4

Parsing

JSON bien formé, puis noms de champs, puis valeurs.
5

Règles métier

Sender ID, template, crédit, limite de débit.
Exécuté sur une 0.7.3 en production : un corps illisible sans identifiants renvoie l’erreur d’authentification, pas l’erreur de parsing :
Corrigez les identifiants avant de déboguer une charge utile. Un 401 ou un 403 ne vous dit rien sur la validité du reste de votre requête, parce que rien en aval de l’authentification n’a encore été exécuté.

Authentification et autorisation

401 signifie “vous ne vous êtes pas identifié” ; 403 signifie “vous l’avez fait, et cela n’a pas été accepté.” La distinction vaut la peine d’être câblée dans votre alerting : un 401 soudain est habituellement un déploiement qui a perdu sa variable d’environnement, tandis qu’un 403 soudain est habituellement une rotation de mot de passe ou une IP qui a bougé.
Un chemin inconnu sous /secure/ renvoie 401, pas 404. L’authentification s’exécute avant le routage, donc l’API ne dira pas à un appelant non authentifié quels endpoints existent. N’utilisez pas un 404 pour sonder la disponibilité d’un endpoint. Vous obtiendrez 401 quoi que vous demandiez.

Négociation de contenu

Omettre Accept entièrement est bien. Envoyer Accept: text/plain ne l’est pas, et c’est la seule erreur qu’une barre d’adresse de navigateur produira de manière fiable.

Parsing

412 pour du JSON invalide, pas 400. La plupart des APIs utilisent 400 pour les deux, donc un client qui branche sur le statut traitera “votre JSON est cassé” comme une surprise de niveau réseau. Les deux sont permanentes, ne réessayez ni l’une ni l’autre.

Règles métier

Il n’y a pas de Retry-After sur un 429. Faites votre propre backoff — exponentiel, avec du jitter. Un retry à intervalle fixe depuis plusieurs workers les resynchronise sur la rafale suivante.

Lesquelles réessayer ?

Un 500 est sûr à réessayer précisément parce que le débit est inversé. C’est une propriété délibérée de l’ingress, pas un hasard : le crédit est prélevé avant la mise en file et restitué lorsque celle-ci échoue, donc un retry coûte un message, pas deux. Voir Comment fonctionne la facturation.

Voir aussi

Vue d'ensemble de l'API REST

L’enveloppe, l’authentification et la règle sur les noms de champs.

Envoyer un message

Chaque champ, avec sa valeur par défaut et son refus.