Codes de statut HTTP
Tous les codes de statut HTTP, avec leur signification et quand les utiliser.
À propos de cet outil
Retrouvez n’importe quel code de statut HTTP par son numéro ou son nom. Chacun dispose d’une description simple et d’une note sur quand le renvoyer, utile pour concevoir une API ou analyser une requête en échec.
Mode d’emploi
- Saisissez un code de statut, comme 404, ou un mot, comme redirect ou rate limit.
- Filtrez par classe : 1xx information, 2xx succès, 3xx redirections, 4xx erreurs client, 5xx erreurs serveur.
- Lisez ce que signifie chaque code et quand le renvoyer.
Questions
- Quelle est la différence entre 401 et 403 ?
- 401 signifie que le client n’est pas authentifié, par exemple parce que le jeton est absent ou expiré. 403 signifie que le client est authentifié mais n’a pas le droit de faire cette action.
- Les erreurs de validation doivent-elles renvoyer 400 ou 422 ?
- Les deux sont utilisés. Une convention courante : 400 pour les requêtes qui ne peuvent pas être analysées et 422 pour les requêtes bien formées dont les valeurs échouent à la validation.
- Quand utiliser 301 plutôt que 308 ?
- Ce sont deux redirections permanentes. Avec 301, les navigateurs peuvent transformer un POST en GET ; 308 garantit que la méthode et le corps sont conservés. Pour un simple déplacement de page, 301 convient.
- Quelle est la différence entre 502 et 504 ?
- Les deux proviennent d’un proxy ou d’un répartiteur de charge. 502 signifie que le serveur situé derrière a renvoyé une réponse invalide ou a planté ; 504 signifie qu’il n’a pas répondu à temps.
- Que signifie le code de statut 0 ?
- Ce n’est pas un statut HTTP. Les navigateurs renvoient 0 quand aucune réponse n’a atteint le script : la requête a été bloquée par CORS, annulée, a rencontré une erreur réseau ou DNS, ou a été bloquée comme contenu mixte. Consultez la console du navigateur et l’onglet Réseau pour connaître la vraie raison.
- Peut-on renvoyer 404 au lieu de 403 ?
- Oui. La RFC 9110 permet à un serveur de répondre 404 quand il ne veut pas révéler l’existence d’une ressource à quelqu’un qui n’a pas le droit de la voir. GitHub procède ainsi pour les dépôts privés. Utilisez 403 quand le client peut savoir que la ressource existe mais n’est pas autorisé à y accéder.
- Quels codes de statut peuvent être mis en cache par défaut ?
- Selon la RFC 9110, les réponses 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414 et 501 peuvent être mises en cache de façon heuristique quand aucun en-tête Cache-Control ou Expires n’indique le contraire. Un CDN peut donc continuer à servir un 404 pendant un certain temps. Envoyez des en-têtes de cache explicites pour maîtriser ce comportement.
Que sont les codes de statut HTTP ?
Chaque réponse HTTP commence par un code de statut à trois chiffres qui indique au client comment s’est passée la requête. Les codes et leur signification sont définis dans la RFC 9110, quelques-uns étant ajoutés par d’autres RFC, comme 429 Too Many Requests issu de la RFC 6585. Le premier chiffre fixe la classe : 1xx information, 2xx succès, 3xx redirection, 4xx erreur client et 5xx erreur serveur. Un client qui ne connaît pas un code le traite comme le code x00 de sa classe.
C’est sur la classe que la plupart des logiciels se basent. Les navigateurs suivent les redirections 3xx, la logique de nouvelle tentative réessaie généralement certaines réponses 5xx mais jamais la plupart des 4xx, et la supervision compte les 5xx comme des erreurs de votre côté. Le message qui suit le nombre, comme « Not Found », n’est qu’informatif, et HTTP/2 le supprime complètement. C’est pourquoi choisir le bon numéro compte davantage que le message qui l’accompagne.
Quel code de statut HTTP mon API doit-elle renvoyer ?
Commencez par les cas courants. Renvoyez 200 pour une lecture ou une mise à jour réussie avec un corps, 201 avec un en-tête Location quand un POST crée quelque chose, et 204 quand il n’y a rien à renvoyer, par exemple après un DELETE. Utilisez 202 quand le traitement est mis en file d’attente et se termine plus tard. Évitez de renvoyer 200 avec un message d’erreur dans le corps : les clients, les caches et les outils de supervision se fient d’abord au code de statut.
Pour les erreurs, distinguez la faute du client de la vôtre. Utilisez 400 pour une entrée mal formée, 404 quand la ressource n’existe pas, 409 pour les conflits comme une adresse e-mail en double, et 429 avec un en-tête Retry-After pour la limitation de débit. Réservez les 5xx aux défaillances côté serveur, et journalisez les détails au lieu de renvoyer des traces de pile. Un corps d’erreur cohérent, comme les Problem Details de la RFC 9457, aide les clients à afficher des messages utiles.
Comment vérifier le code de statut d’une requête ?
Dans le navigateur, ouvrez les outils de développement, passez à l’onglet Réseau et rechargez la page. La colonne Statut affiche le code de chaque requête, y compris les appels fetch échoués lancés par des scripts. En ligne de commande, curl -i affiche la ligne de statut et les en-têtes de réponse avant le corps, curl -I envoie une requête HEAD pour n’afficher que les en-têtes, et l’ajout de -L suit les redirections pour que vous voyiez chaque étape.
Quand un code vous surprend, cherchez qui l’a envoyé. Un 502, 503 ou 504 vient souvent de nginx, d’un load balancer ou d’un CDN plutôt que de votre application : vérifiez donc l’en-tête Server et les journaux du proxy. Un 404 sur une route dont vous savez qu’elle existe signifie généralement un mauvais chemin de base ou une incohérence de barre oblique finale, tandis qu’un 405 signifie que le chemin existe, mais pas pour cette méthode. Le Générateur et convertisseur de commandes curl aide à reconstruire la requête qui échoue.
Tous les codes de statut HTTP
Tous les codes de statut, avec leur signification et quand les renvoyer, regroupés par classe.
Information (1xx)
| Code | Nom | Signification | Quand l’utiliser |
|---|---|---|---|
| 100 | Continue | Le serveur a reçu les en-têtes de la requête ; le client doit envoyer le corps. | Envoyé automatiquement quand un client le demande avec Expect: 100-continue. |
| 101 | Switching Protocols | Le serveur passe au protocole demandé par le client. | Passage d’une connexion à WebSocket. |
| 103 | Early Hints | En-têtes préliminaires pour que le navigateur puisse commencer le préchargement. | Envoyer des en-têtes Link pour le CSS et les polices pendant que la page est encore en cours de génération. |
Succès (2xx)
| Code | Nom | Signification | Quand l’utiliser |
|---|---|---|---|
| 200 | OK | La requête a réussi. | Valeur par défaut pour un GET réussi, ou un POST qui renvoie un résultat. |
| 201 | Created | Une nouvelle ressource a été créée. | Après un POST qui crée quelque chose. Incluez un en-tête Location qui pointe vers la ressource. |
| 202 | Accepted | La requête a été acceptée mais n’a pas encore été traitée. | Tâches en file d’attente ou en arrière-plan. Fournissez un moyen de suivre la progression. |
| 204 | No Content | Succès, sans rien à renvoyer. | Un DELETE ou un PUT qui ne renvoie pas de corps. |
| 206 | Partial Content | Seule une partie de la ressource est renvoyée. | Réponse à une requête Range, pour le streaming vidéo ou les téléchargements avec reprise. |
Redirection (3xx)
| Code | Nom | Signification | Quand l’utiliser |
|---|---|---|---|
| 301 | Moved Permanently | La ressource a une nouvelle URL permanente. | Anciennes URL après une refonte de site. Les navigateurs et les moteurs de recherche la retiennent. |
| 302 | Found | La ressource se trouve temporairement à une autre URL. | Redirections temporaires. Les clients peuvent transformer un POST en GET ; préférez 303 ou 307 pour être explicite. |
| 303 | See Other | Récupérer le résultat à une autre URL avec GET. | Rediriger après un POST de formulaire pour qu’une actualisation ne le renvoie pas. |
| 304 | Not Modified | La copie en cache est toujours valide. | Réponse à une requête conditionnelle avec If-None-Match ou If-Modified-Since. |
| 307 | Temporary Redirect | Répéter la même requête à une autre URL. | Redirection temporaire qui doit conserver la méthode et le corps. |
| 308 | Permanent Redirect | Répéter la même requête à une nouvelle URL permanente. | Comme 301, mais la méthode et le corps ne doivent pas changer. |
Erreur client (4xx)
| Code | Nom | Signification | Quand l’utiliser |
|---|---|---|---|
| 400 | Bad Request | La requête est mal formée ou invalide. | JSON impossible à analyser, champs obligatoires manquants, types incorrects. |
| 401 | Unauthorized | L’authentification est absente ou invalide. | Jeton absent ou expiré. Malgré son nom, ce code signifie « non authentifié ». |
| 402 | Payment Required | Réservé ; utilisé par certaines API pour les problèmes de facturation. | Limite du forfait atteinte ou échec du paiement. |
| 403 | Forbidden | Le client est identifié mais n’a pas le droit de faire cette action. | Connecté, mais sans les droits nécessaires. |
| 404 | Not Found | Rien n’existe à cette URL. | Routes ou ID inconnus. Sert aussi à masquer des ressources dont le client n’est pas censé connaître l’existence. |
| 405 | Method Not Allowed | Cette URL ne prend pas en charge cette méthode HTTP. | Un POST vers un point de terminaison en lecture seule. Incluez un en-tête Allow. |
| 406 | Not Acceptable | Aucune représentation ne correspond à l’en-tête Accept. | Le client a demandé du XML à une API qui ne parle que JSON. |
| 408 | Request Timeout | Le client a mis trop de temps à envoyer la requête. | Connexions inactives. Les clients peuvent réessayer sans risque. |
| 409 | Conflict | La requête entre en conflit avec l’état actuel. | Valeurs uniques en double, ou modification basée sur une version périmée. |
| 410 | Gone | La ressource a existé mais a été supprimée définitivement. | Contenu supprimé ou versions d’API retirées. Plus fort que 404. |
| 411 | Length Required | Un en-tête Content-Length est requis. | Envois sans taille déclarée. |
| 412 | Precondition Failed | Un en-tête conditionnel ne correspondait pas. | If-Match avec un ETag obsolète, pour éviter les mises à jour perdues. |
| 413 | Content Too Large | Le corps de la requête dépasse la taille acceptée par le serveur. | Envois dépassant la taille limite. |
| 414 | URI Too Long | L’URL est plus longue que ce que le serveur accepte. | Chaînes de requête énormes. Déplacez les données dans le corps d’un POST. |
| 415 | Unsupported Media Type | Le format du corps n’est pas pris en charge. | Envoi de données de formulaire à un point de terminaison JSON, ou Content-Type erroné. |
| 416 | Range Not Satisfiable | La plage d’octets demandée est en dehors du fichier. | Une requête Range au-delà de la fin de la ressource. |
| 418 | I’m a teapot | Un poisson d’avril de 1998 qui est resté. | Uniquement pour les easter eggs. |
| 422 | Unprocessable Content | La requête est bien formée mais échoue à la validation. | JSON valide avec des valeurs invalides, comme une date de fin antérieure à la date de début. |
| 423 | Locked | La ressource est verrouillée. | WebDAV, ou un enregistrement en cours de modification par quelqu’un d’autre. |
| 425 | Too Early | Le serveur refuse de risquer le traitement d’une requête qui pourrait être rejouée. | Données anticipées TLS (0-RTT). |
| 426 | Upgrade Required | Le client doit passer à un autre protocole. | Pour imposer une version plus récente de TLS ou HTTP. |
| 428 | Precondition Required | La requête doit être conditionnelle. | Exiger If-Match lors des mises à jour pour éviter les écritures perdues. |
| 429 | Too Many Requests | Le client envoie des requêtes trop rapidement. | Limitation du débit. Incluez un en-tête Retry-After. |
| 431 | Request Header Fields Too Large | Les en-têtes sont trop volumineux. | Des cookies trop volumineux en sont généralement la cause. |
| 451 | Unavailable For Legal Reasons | Bloqué pour des raisons légales. | Contenu retiré par décision de justice ou bloqué dans un pays. |
Erreur serveur (5xx)
| Code | Nom | Signification | Quand l’utiliser |
|---|---|---|---|
| 500 | Internal Server Error | Une erreur s’est produite sur le serveur. | Exceptions non gérées. Journalisez les détails, ne les divulguez pas au client. |
| 501 | Not Implemented | Le serveur ne prend pas en charge cette fonctionnalité. | Une méthode HTTP que le serveur ne reconnaît pas du tout. |
| 502 | Bad Gateway | Un proxy a reçu une réponse invalide du serveur situé derrière lui. | L’application derrière nginx ou un répartiteur de charge a planté ou renvoyé n’importe quoi. |
| 503 | Service Unavailable | Le serveur ne peut pas traiter de requêtes pour le moment. | Maintenance ou surcharge. Incluez Retry-After si vous savez quand le service sera rétabli. |
| 504 | Gateway Timeout | Un proxy n’a pas reçu de réponse à temps. | L’application en amont est trop lente ou bloquée. |
| 505 | HTTP Version Not Supported | La version HTTP n’est pas prise en charge. | Rare ; versions de protocole très anciennes ou très récentes. |
| 507 | Insufficient Storage | Le serveur n’a pas la place de stocker le résultat. | Disque plein, ou quota de stockage atteint. |
| 508 | Loop Detected | Le serveur a détecté une boucle infinie pendant le traitement. | WebDAV, ou une boucle de redirection ou de proxy. |
| 511 | Network Authentication Required | Le client doit se connecter pour accéder au réseau. | Portails captifs des Wi-Fi d’hôtels et d’aéroports. |
Quelque chose ne fonctionne pas, ou un résultat semble faux ? Signaler un problème avec cet outil