Les pubs vous déplaisent ? Aller Sans pub Auj.

Codes d'état HTTP Quand retourner 404 vs 410 vs 301 (et arrêtez de deviner)

Mis à jour le

Les développeurs backend se trompent souvent sur les codes d'état HTTP. Voici un guide pratique sur les codes qui comptent réellement dans les API REST — 404 contre 410, 301 contre 3-02, limitation de vitesse 429, et le contre-exemple du code 200 avec un corps d'erreur.

Codes d'état HTTP : Quand retourner 404 vs 410 vs 301 (et arrêtez de deviner) 1
ANNONCE · Supprimer ?

Vous avez retourné 200 avec {"error": "user not found"} dans le corps. Vos 301 sont en réalité des 302. Les ressources supprimées continuent de retourner 404 indéfiniment. Examinons les codes d'état que les développeurs utilisent le plus souvent mal, et ce qu'il faut retourner à la place.

4xx vs 5xx : Pas la même boîte

La séparation fondamentale dans les codes d'état HTTP : 4xx correspond à une faute du client, 5xx correspond à votre erreur. Simple en théorie, violée constamment en pratique.

L'offenseur le plus courant : retourner 500 pour une erreur de validation. Un utilisateur a envoyé un JSON mal formé à votre API. C'est une 400 Bad Request — son payload était erroné. Un 500 indique au client « nous avons crashé », ce qui déclenche des alertes, est enregistré comme une erreur serveur, et fait réessayer automatiquement (ce qui aggrave votre journée). Si l'utilisateur a envoyé du contenu invalide, dites-le avec un 4xx.

404 vs 410 : Le problème de la ressource supprimée

404 Not Found signifie : « Je n'ai pas cette ressource en ce moment, mais essayez plus tard. » Les robots de recherche — y compris Googlebot — considèrent 404 comme temporaire. Ils continueront à vérifier indéfiniment.

410 Gone signifie : « Cette ressource a été supprimée de manière permanente. Arrêtez de la demander. » Googlebot retire plus rapidement les URLs 410 de l'index que les URLs 404, et cesse plus tôt de les crawler. Cela compte pour l'optimisation des moteurs de recherche et pour le budget de crawling sur des grands sites.

La règle pratique : si votre API supprime définitivement une entrée et qu'elle ne revient jamais, retournez 410 sur les demandes suivantes. La seule raison de préférer 404 pour une ressource supprimée est si elle pourrait être restaurée — suppression douce avec une fenêtre de récupération, un article publié pouvant être républié, ce genre de choses. Sinon, 410 est plus honnête et les moteurs de recherche vous remercieront.

301 vs 302 (et pourquoi 307/308 existent)

301 Moved Permanently: Cette URL est disparue pour toujours, utilisez l'autre. Les navigateurs stockent les 301 de manière agressive. Les moteurs de recherche transfèrent l'équité de lien vers la destination. Si vous consolidez des domaines ou déplacez de manière permanente un site, 301 est ce que vous voulez.

302 Found: Allez sur cette autre URL pour l'instant, mais revenez plus tard sur l'ancienne. Aucun stockage. Aucun transfert d'équité de lien. Utilisez-le pour les redirections de connexion, les pages de maintenance temporaires ou les tests A/B.

Le mode de défaillance : utiliser 302 pour des déplacements permanents. Vous pensez « la même chose, juste différente », mais les moteurs de recherche ne transmettent pas l'équité de lien par 302. Des années de travail en SEO restent attachées à l'ancienne URL tandis que la nouvelle ne se classe pas. Si vous déplacez quelque chose de manière permanente, utilisez 301.

Puis il y a 307 Temporary Redirect et 308 Permanent Redirect. Ces variantes sont sécuritaires par méthode : lorsque le navigateur peut réduire une requête POST en GET lorsqu'il suit une 301/302, les 307/308 conservent la méthode originale. Si vous redirigez des points d'entrée d'API qui acceptent des corps POST, 307 (temporaire) ou 308 (permanente) conserve la méthode.

CodeTaperLes caches ?Conserve-t-elle la méthode ?Utilisez pour
301PermanentOuiNon (peut descendre à GET)Les déplacements permanents d'un site, consolidation d'URLs
302TemporaireNonNon (peut descendre à GET)Redirections de connexion, indisponibilité temporaire
307TemporaireNonOuiRedirection temporaire pour des points d'entrée d'API POST
308PermanentOuiOuiRedirection permanente pour des points d'entrée d'API POST

401 vs 403 : Authentification vs Autorisation

Le nom est confus. 401 Unauthorized signifie en réalité non authentifié — vous n'êtes pas connecté, ou vos identifiants sont manquants ou invalides. 403 Forbidden signifie que vous êtes authentifié, mais que vous n'avez pas les permissions d'accéder à cette ressource.

La différence pratique : un 401 doit faire apparaître une page de connexion ou une mise à jour du token. Un 403 doit afficher un message d'interdiction d'accès. Retournez le mauvais code et votre client ne saura pas s'il doit demander des identifiants ou abandonner.

Il y a aussi une dimension de sécurité. Certains APIs retournent 404 au lieu de 403 pour des ressources que l'appelant ne peut pas accéder, afin d'éviter de révéler qu'elles existent. Si vous retournez 403 sur une ressource d'un autre tenant, vous confirmez qu'elle existe. Retourner 404 est plus sécurisé en termes d'information, bien que cela rende la déboguation plus difficile pour les utilisateurs légitimes. Choisissez le compromis qui correspond à votre modèle de menace et appliquez-le de manière cohérente.

429 : Limiter le taux, avec la tête qui aide réellement

Un simple 429 Too Many Requests est désagréable. Un 429 avec une Retry-After est vraiment utile.

HTTP/1.1 429 Too Many Requests
Retry-After: 30
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1746374400

Retry-After peut être une durée en secondes ou une date HTTP. Les clients bien comportés feront une pause automatiquement. Sans cela, vous retournez un code d'erreur et espérez que le client comprendra quand réessayer — la plupart vont simplement frapper votre point d'entrée à nouveau, ce qui annule l'objectif de limitation du taux.

Ne retournez pas 503 pour la limitation du taux. 503 signifie « service indisponible » — l'infrastructure est en panne, une mise à jour est en cours, un interrupteur est ouvert. La limitation du taux est une décision de politique, pas une panne du service. 429 existe exactement pour cela.

L'anti-modèle « 200 avec un corps d'erreur »

Ce modèle apparaît constamment dans les API en production et doit cesser :

HTTP/1.1 200 OK
Content-Type: application/json

{"status": "error", "message": "user not found"}

Cela casse tout ce qui dépend des sémantiques HTTP. Les outils de surveillance considèrent la requête comme réussie. Les équilibres de charge la transmettent. Les bibliothèques clients ne la lancent pas. Les journaux semblent propres alors que les utilisateurs voient des erreurs. La solution est une ligne de code : retournez le bon code d'état. 200 signifie que la requête a réussi. Si elle n'a pas réussi, ne retournez pas 200.

La même logique s'applique à 201 vs 200 pour la création de ressources. Si une requête POST à /users crée un nouvel utilisateur, retournez 201 Created avec un Location en indiquant l'URL de la nouvelle ressource. Retournez 200 et vous perdez des informations que vos clients pourraient utiliser pour éviter une nouvelle requête.

Scénario API → Code d'état correct

Voici un tableau de référence pour les scénarios les plus fréquents en développement d'API REST :

ScénarioCode d'étatRemarques
Le corps de la requête est mal formé en JSON400 Bad RequestIncluez un message pointant vers l'erreur de parsing
Champ manquant ou invalide dans la requête422 Unprocessable EntityLe code 422 est plus précis que 400 pour les échecs de validation sémantique
Le token d'authentification manquant ou expiré401 UnauthorizedInclure WWW-Authenticate en-tête
Authentifié mais sans permission403 ForbiddenOu 404 si le masquage de l'existence de la ressource est requis
La ressource n'est pas trouvée, peut retourner404 Not FoundPour une absence temporaire ou une ressource inconnue
La ressource supprimée de manière permanente410 GoneLes robots de recherche arrêteront plus tôt de la vérifier
Une ressource a été créée201 CreatedAjouter Location: /resources/new-id en-tête
La suppression par DELETE a réussi, sans corps204 No ContentNe retournez pas un objet JSON vide avec 200
Changement permanent d'URL301 Moved PermanentlyLes moteurs de recherche transfèrent l'équité de lien
Redirection temporaire302 FoundAucun stockage, aucun transfert d'équité de lien
Limite de taux dépassée429 Too Many RequestsIncluez toujours Retry-After
Exception inattendue sur le serveur500 Internal Server ErrorNe révèle pas les traces de pile dans le corps
Une dépendance supérieure est en panne503 Service UnavailableAjouter Retry-After si la panne est bornée
Redirection POST, conserve la méthode307 ou 308307 temporaire, 308 permanent

Quand vous êtes en pleine PR et que vous devez vérifier ce que signifie un code d'état, l'outil Recherche des codes d'état HTTP vous donne la définition du spécification, les cas d'usage typiques et la RFC qui le définit.

Vérification des chaînes de redirection

Après une migration ou une restructuration d'URL, il est utile de vérifier la chaîne complète de redirection — surtout si vous avez des 301 qui ont été ensuite mis à jour pour pointer ailleurs, créant des chaînes à plusieurs sauts qui dégradent l'équité de lien. L'outil Vérificateur de redirection trace la chaîne et montre chaque code d'état en séquence, afin de confirmer que tout se résout en un seul saut.

Envie d'une expérience sans pub ? Passez à la version sans pub

Installez nos extensions

Ajoutez des outils IO à votre navigateur préféré pour un accès instantané et une recherche plus rapide

Sur Extension Chrome Sur Extension de bord Sur Extension Firefox Sur Extension de l'opéra

Le Tableau de Bord Est Arrivé !

Tableau de Bord est une façon amusante de suivre vos jeux, toutes les données sont stockées dans votre navigateur. D'autres fonctionnalités arrivent bientôt !

ANNONCE · Supprimer ?
ANNONCE · Supprimer ?
ANNONCE · Supprimer ?

Coin des nouvelles avec points forts techniques

Impliquez-vous

Aidez-nous à continuer à fournir des outils gratuits et précieux

Offre-moi un café
ANNONCE · Supprimer ?