Quand utiliser le code d'état HTTP 404 dans une API

58

Je travaille sur un projet et après avoir discuté avec des personnes au travail pendant environ plus d'une heure. J'ai décidé de savoir ce que les gens sur stack-exchange pourraient dire.

Nous écrivons une API pour un système, une requête doit renvoyer une arborescence Organisation ou une arborescence Objectifs.

L'arborescence de l'organisation est l'organisation dans laquelle l'utilisateur est présent. En d'autres termes, cette arborescence doit toujours exister. Dans l'organisation, un arbre de but doit toujours être présent. (c'est là que l'argument a commencé). Au cas où l'arbre n'existerait pas, mon collègue a décidé qu'il serait correct de répondre à l'aide du code d'état 200. Ensuite, j'ai commencé à me demander de corriger mon code car l'application était en train de s'effondrer lorsqu'il n'y avait pas d'arbre.

Je vais essayer d'épargner les flammes et la fureur.

J'ai suggéré de générer une erreur 404 lorsqu'il n'y a pas d'arbre. Cela me permettrait au moins de savoir que quelque chose ne va pas. Lorsque j'utilise 200, je dois ajouter une vérification spéciale à ma réponse dans le rappel de réussite pour gérer les erreurs. Je m'attends à recevoir un objet, mais je peux recevoir une réponse vide car rien n'est trouvé. Cela semble tout à fait juste de marquer la réponse comme un 404. Et puis la guerre a commencé et j'ai reçu le message que je ne comprenais pas le schéma de code de statut HTTP. Donc, je suis ici et demande ce qui ne va pas avec 404 dans ce cas? J'ai même eu l'argument "Il n'a rien trouvé , il est donc correct de retourner 200". Je crois que c'est faux car l'arbre devrait toujours être présent. Si nous ne trouvons rien et que nous attendons quelque chose, ce devrait être un 404.

Plus d'informations,

J'ai oublié d'ajouter les URL récupérées.

Les organisations

/OrgTree/Get

Buts

/GoalTree/GetByDate?versionDate=...
/GoalTree/GetById?versionId=...

Mon erreur, les deux paramètres sont nécessaires. Si une versionDate pouvant être analysée avec une date est fournie, la révision se ferme. Si vous entrez quelque chose dans le passé, la première révision sera renvoyée. Si par Id avec un identifiant qui n'existe pas, je soupçonne qu'il va retourner une réponse vide avec 200.

Supplémentaire

De plus, je pense que la meilleure solution au problème consiste à créer des objets par défaut lors de la création d'organisations. Ne pas avoir d'arborescence ne devrait pas être un cas valable et devrait être considéré comme un comportement indéfini. Il est impossible qu'un compte puisse être utilisé sans les deux arbres. Pour cette raison, ils devraient toujours être présents.

aussi je me suis lié ceci (un semblable mais je ne peux pas le trouver)

http://viswaug.files.wordpress.com/2008/11/http-headers-status1.png

Loïc Faure-Lacroix
la source
Veuillez préciser: comment l’application peut-elle se désagréger s’il n’ya pas d’arbre, s’il ya toujours un arbre par condition préalable ? (Je suis d'accord avec vous, cela ressemble à un 404)
Andres F.
Eh bien, le code ne vérifiait pas la valeur null et analysait une chaîne json en tant qu’objet. À un certain endroit du code, l'objet qui "est" chargé n'est pas présent car il ne peut pas être trouvé en interne.
Loïc Faure-Lacroix
4
Il serait plus clair si vous donnez les URI de la ressource à laquelle vous essayez d'accéder. Si c'est / buts / vous retournez 200 et un ensemble vide. Si vous essayez d'accéder à / buts / {goal_id}, vous retournez 404. Si vous avez renvoyé 404 pour une demande de / buts /, cela signifie que l'URI n'existe pas et ne doit plus être utilisé.
Imel96
1
Toujours dans les deux cas, la question est vraie. Que devrait /GoalTree/GetById?versionId=CompletelyInvalidIDrevenir? Pas de succès, car la ressource nommée /GoalTree/GetById?versionId=CompletelyInvalidIDétait littéralement introuvable.
2
Génial, maintenant la discussion est passée de votre travail aux internets! C'est imparable maintenant!
Carlos Campderrós le

Réponses:

80

En cas de doute, consultez la documentation . L'examen des définitions du W3C pour les codes d'état HTTP nous donne ceci:

200 OK - La demande a abouti. Les informations renvoyées avec la réponse dépendent de la méthode utilisée dans la demande.

404 Introuvable - Le serveur n'a rien trouvé qui corresponde à l'URI de demande.

Dans le contexte de votre API, cela dépend beaucoup de la manière dont les requêtes sont créées et de la manière dont les objets sont récupérés. Mais, mon interprétation a toujours été que:

  • Si je demande un objet particulier et qu'il existe, renvoyer le 200code, s'il n'existe pas, renvoyer le 404code correct .
  • Mais, si je demande un ensemble d'objets correspondant à une requête, un ensemble nul est une réponse valide et je souhaite le renvoyer avec un 200code. La raison en est que la requête était valide, qu'elle a réussi et que la requête n'a rien renvoyé.

Donc, dans ce cas, vous avez raison , le service ne recherche pas "une chose spécifique" mais demande une chose particulière, si cette chose ne se trouve pas, dites-le clairement.

Je pense que Wikipedia le dit le mieux:

200 OK - ... La réponse réelle dépend de la méthode de requête utilisée. Dans une demande GET, la réponse contiendra une entité correspondant à la ressource demandée.

404 Introuvable - La ressource demandée est introuvable mais peut être disponible à nouveau dans le futur. Les demandes ultérieures du client sont acceptables.

Cela me semble assez clair.

Concernant les exemples de demandes

/GoalTree/GetByDate?versionDate=...
/GoalTree/GetById?versionId=...

Pour le format, vous avez dit, vous renvoyez toujours la révision la plus proche à cette date. Il ne retournera jamais un objet, il devrait donc toujours y retourner 200 OK. Même si cela pouvait prendre une plage de dates et que la logique devait renvoyer tous les objets dans cette période, 200 OK - 0 Results est correct, car c'est ce à quoi la demande était destinée - l'ensemble des éléments répondant à ce critère.

Cependant, ce dernier est différent car vous demandez un objet spécifique , probablement unique, avec cette identité. Retourner 200 OKdans ce cas est faux car la ressource demandée n'existe pas et n'est pas trouvée .

Concernant le choix des codes de statut

  • Codes 2xx Indiquez à un agent utilisateur qu'il a agi correctement , la requête a fonctionné. Il peut continuer à le faire à l'avenir.
  • Codes 3xx Indiquez à un agent utilisateur ce que vous avez demandé si vous aviez l'habitude de travailler, mais cette chose est maintenant ailleurs. À l'avenir, l'UA pourrait envisager de ne faire que la redirection .
  • Codes 4xx Dites à un agent utilisateur qu'il a commis une erreur , que la requête qu'il a créée n'est pas appropriée et ne doit plus être essayée sans modification.
  • Codes 5xx Indiquez à un agent utilisateur que le serveur est en quelque sorte en panne . Mais bon, cette requête pourrait fonctionner dans le futur, il n’ya donc aucune raison de ne pas essayer à nouveau. (sauf pour 501, qui est plus d'un numéro 400).

Vous avez mentionné dans un commentaire utilisant un code 5xx, mais votre système fonctionne. Il a été demandé à une requête qui ne fonctionne pas et doit communiquer cela à l'agent utilisateur. Peu importe comment vous le découpez, il s'agit d'un territoire 4xx.

Considérons un extraterrestre qui interroge notre système solaire

Alien: Ordinateur, dis-moi s'il te plaît toutes les planètes habitées par les humains.

Ordinateur: 1 résultat trouvé. Terre

Alien: Ordinateur, parle-moi de la Terre , s'il te plaît .

Ordinateur: Terre - Presque inoffensif.

Alien: Ordinateur, parlez-moi de toutes les planètes habitées par les humains, en dehors de la ceinture d'astéroïdes.

Ordinateur: 0 résultats trouvés.

Alien: Ordinateur, détruis la Terre, s'il te plaît.

Ordinateur: 200 OK.

Alien: Ordinateur, parle-moi de la Terre , s'il te plaît .

Ordinateur: 404 - introuvable

Alien: Ordinateur, dis-moi s'il te plaît toutes les planètes habitées par les humains.

Ordinateur: 0 résultats trouvés.

Alien: victoire pour le puissant empire Irken!

Nick Tsai
la source
4
+1 Ce n'est pas une requête qui ne renvoie aucun résultat. Cela revient à demander au navigateur une page Web connue et à ne pas la trouver. Exactement ce que 404 est là pour.
Andres F.
2
@ imel96 vous oubliez que la chaîne de requête fait partie de l'URL.
Loïc Faure-Lacroix le
1
@LegoStormtroopr Votre exemple amusant "d'alien" fonctionne parce que l'univers n'est PAS invalide lorsque la Terre n'existe pas. Mais selon l'explication du PO, son système doit inclure l'arbre. Sans arbre, le système ne fonctionne pas.
Andres F.
1
@LegoStormtroopr imagine une table de base de données. Vous interrogez la table, parfois vous obtenez un résultat, parfois non. Table est votre ressource, elle est toujours présente, qu’elle retourne des lignes ou non. La table est identifiable, son nom est donné (comme les ressources http ont des URI). Les lignes ne sont pas, elles correspondent uniquement à certains paramètres. Même en base de données, si vous effectuez une mise à jour qui ne correspond à rien, vous obtiendrez "OK 0 lignes affectées".
Imel96
2
@LegoStormtroopr vous avez déjà la réponse. S'ils veulent remapper / GoalTree / GetById? VersionId = x, ils doivent renvoyer 301 avec l'en-tête Location défini sur / GoalTree / Id / x.
Imel96
11

Ignorant le fait que / GoalTree / Get * ressemble à un verbe et non à des ressources, vous devez toujours renvoyer 200, car l'URI / GoalTree / Get * représente des ressources toujours disponibles pour l'accès et ne constitue pas une erreur du client s'il n'y a pas d'arbre résultant. une requête. Il suffit de retourner 200 avec un ensemble vide lorsqu'il n'y a aucune entité à renvoyer.

Vous utilisez 404 si la ressource n'est pas trouvée, pas lorsqu'il n'y a pas d'entité.

En d'autres termes, si vous voulez renvoyer 404 pour vos objets, donnez-leur leurs propres URI.

imel96
la source
1
Hmm. C'est logique. 404 est une erreur de l' utilisateur , mais comme l'explique l'OP, il s'agit en fait d'une erreur de système . la demande de l'utilisateur est parfaitement valide! Je ne suis pas d’accord que 200 soit la bonne réponse, car "pas d’arbre" est une erreur .
Andres F.
@ imel96 Je préférerais que des entités valides soient toujours renvoyées à la place du code vide / d'état 4xx / 5xx. Si ce n'était que moi, je renverrais une entité valide, comme le fait un wiki par exemple. Moins de maux de tête, pas besoin de gérer les erreurs. En l'état actuel, je dirais que c'est un peu comme un 500. Le système est dans un état non défini, cela ne devrait pas arriver. Et retourner OK n'a pas de sens. 404 concernant la RFC n'a également aucun sens. Alors, quand rien n’a de sens… seulement 500 l’ont de sens!
Loïc Faure-Lacroix le
@ Sybiam, vous avez demandé un code de statut http qui est très bien défini. À cet égard, même si votre logique métier dit qu'il s'agit d'une erreur, cela ne signifie pas que le système, en tant que serveur HTTP, comporte une erreur. Dans votre cas, il a compris votre demande, il a traité votre requête et il est juste arrivé que le résultat ne soit aucune entité. Donc, vous ne pouvez pas non plus utiliser 500. Au moins, envisagez de donner à vos objets les adresses URI appropriées et de voir si le processeur RF a plus de sens ou non.
Imel96
+1 Si vous aviez une API REST (chaque entité avait son propre chemin), vous pouvez alors renvoyer une 404, mais vos chemins sont des verbes et seront toujours trouvés.
Arrêtez de blesser Monica le
@OrangeDog: /GoalTree/GetById?versionId=12345 est un URI tout à fait correct (enfin, relatif, au moins) qui identifie une ressource spécifique, à savoir les données correspondant à l'ID de version 12345dans le système. Si aucune donnée avec un tel ID n'existe, une réponse HTTP 404 est parfaitement appropriée. Bien entendu, le corps de la réponse doit, dans tous les cas, contenir une réponse formatée de manière appropriée (par exemple, JSON, si c'est ce à quoi s'attendent les clients types demandant de telles ressources) indiquant la nature spécifique et la cause de l'erreur.
Ilmari Karonen
7

C'est une question intéressante, car il s'agit de la spécification du système.

La réponse de imel96 m'a convaincu qu'une réponse 404 ne serait pas une réponse correcte, car la famille de codes 4xx est principalement destinée aux erreurs utilisateur / client , et ce n'est pas le cas. L'URL est bien formée et l'arbre doit être là; si ce n'est pas le cas, le système est dans un état incohérent!

Il s’agit donc d’une erreur de serveur , c’est-à-dire quelque chose de la famille 5xx. Peut-être une erreur de serveur interne 500 générique ou un service 503 indisponible (le service étant "récupérez-moi l'arborescence qui doit y figurer").

Andres F.
la source
2
Ce n'est pas vrai, l'utilisateur est en erreur parce qu'il a demandé quelque chose qui n'existe pas .
@LegoStormtroopr Demander quelque chose qui n'existe pas n'est pas toujours une erreur. Si vous demandez une ressource réseau et que le réseau est en panne, c'est une erreur de réseau .
Andres F.
1
@LegoStormtroopr De plus, l'arbre doit exister; le système ne peut pas fonctionner sans cela, comme l'explique l'OP. Par conséquent, il est valide de demander cette ressource; si ce n'est pas le cas, il doit s'agir d'une erreur système (ou serveur).
Andres F.
2
@Sybiam Si vous allez suivre la route d'un code 5xx, 503 est "Service 503 non disponible - Le serveur est actuellement incapable de traiter la demande en raison d'une surcharge temporaire ou de la maintenance du serveur". Votre serveur n'est pas surchargé, il ne trouve pas de requête. De plus, les codes 5xx sont utilisés lorsque "le serveur est conscient qu'il a commis une erreur ou est incapable d'effectuer la requête"
1
@AndresF. Pour être honnête, un code 500 est probablement bon. Compte tenu de l'évolution de la question au fil du temps, cela fonctionnerait. La plupart du temps, je ne fais que me rallier au retour de 200 si tout ne va pas bien.
6

Je dirais qu'un code de réponse 200 ou 404 peut être valide , selon votre perception de la situation.

Le fait est que les codes de réponse HTTP sont définis dans le contexte d'un serveur , qui peut fournir diverses ressources en fonction de leur URL. Dans ce contexte, les significations de 200 OKet 404 Not Foundsont parfaitement claires: le premier indique "voici la ressource que vous avez demandée", tandis que le dernier indique "désolé, je n'ai aucune ressource de ce type".

Toutefois, dans votre cas, vous disposez d'une couche d' application supplémentaire entre le serveur HTTP et les ressources réelles (arborescences) demandées. L'application occupe une sorte d'espace intermédiaire qui n'est pas bien traité dans la spécification HTTP.

Du point de vue de serveur Web, l'application ressemble genre de comme une ressource: il est généralement un fichier sur le serveur, identifié par (une partie de) l'URL, comme les autres ressources (par exemple , les fichiers statiques) , le serveur peut servir. D'autre part, c'est une sorte de ressource étrange, car elle consiste en un code exécutable qui détermine de manière dynamique le contenu, voire même le code d'état, de la réponse, ce qui la fait ressembler à certains égards à un mini-serveur.

En particulier, dans votre exemple, le serveur Web peut très bien localiser l’application, mais l’application ne parvient pas à localiser la sous-ressource (arborescence) demandée. Maintenant, si vous considérez que l'application est simplement une extension du serveur et que le sous-élément (l'arborescence) est la ressource réelle, une réponse 404 est appropriée: le serveur a simplement délégué la tâche de recherche de la ressource réelle à l'application. , ce qu’il a échoué à son tour.

D'autre part, si votre point de vue est que l'application est la ressource demandée, il est évident que le serveur Web doit renvoyer une réponse 200 ; après tout, l'application a été trouvée et exécutée correctement. Évidemment, dans ce cas, l’application doit en réalité renvoyer un corps de réponse valide au format attendu, indiquant (en utilisant le protocole de niveau supérieur que le format encode) qu'aucune donnée réelle correspondant à la requête n'a été trouvée.

Ces deux points de vue peuvent avoir un sens. Dans la plupart des cas , du moins pour les applications destinées à être directement accessibles via HTTP avec un navigateur Web ordinaire, je préférerais la vue précédente : l'utilisateur ne se soucie généralement pas des détails internes, tels que la différence entre le serveur et l'application, se soucient de savoir si les données qu'ils voulaient est là ou non.

Toutefois, dans le cas spécifique d’une application conçue pour communiquer avec d’autres programmes informatiques à l’aide d’un protocole d’API de haut niveau personnalisé, en utilisant HTTP uniquement comme couche de transport de bas niveau , un argument doit être avancé en faveur de cette dernière vue : Les clients qui interagissent avec une telle application ne se préoccupent vraiment pas, au niveau HTTP , de savoir s'ils ont réussi à contacter l'application ou non. Tout le reste est, dans de tels cas, souvent plus naturellement communiqué en utilisant le protocole de niveau supérieur.


Dans tous les cas, quels que soient les points de vue ci-dessus que vous préférez, vous devez garder à l’esprit quelques détails. La première est que, dans de nombreux cas, il peut exister une distinction significative entre une ressource (essentiellement) vide et une ressource inexistante .

Au niveau HTTP, une ressource vide serait simplement indiquée par un code de réponse 200 et un corps de réponse vide, tandis qu'une ressource inexistante serait indiquée par une réponse 404 et un corps de ressource expliquant l'absence de la ressource. Dans un protocole API de niveau supérieur, on indiquera généralement une ressource non existante par une réponse d'erreur, contenant un code / message d'erreur spécifique au protocole, tandis qu'une réponse vide serait simplement une structure de réponse normale sans éléments de données.

(Notez qu'une ressource n'a pas besoin d'être littéralement zéro octet pour être "vide" dans le sens que je veux dire plus haut. Par exemple, un résultat de recherche sans éléments correspondants est considéré comme vide au sens large, de même qu'un résultat de requête SQL avec pas de lignes ou un document XML ne contenant aucune donnée réelle.)

En outre, bien sûr, si l'application ne croit vraiment que la sous - ressource demandée doit être là, mais ne peut pas le trouver, puis un troisième code de réponse possible existe: 500 Internal Server Error. Une telle réponse a du sens si l’existence de la ressource est une condition préalable supposée de l’application, de sorte que son absence indique nécessairement un dysfonctionnement interne.

Enfin, vous devez toujours garder à l'esprit la loi de Postel :

" Soyez conservateur dans ce que vous envoyez et libéral dans ce que vous recevez. "

Que le serveur doit répondre dans une situation particulière avec une 200 ou une réponse 404, qui n'excuse pas vous en tant que client implementor de manipulation soit une réponse appropriée et de la manière qui maximise l' interopérabilité robuste. Bien sûr, on peut discuter de ce que signifie une manipulation "appropriée" dans différentes situations, mais cela ne devrait certainement pas inclure normalement un crash ou une "chute".

Ilmari Karonen
la source
Le dilemme a bien expliqué.
Marcel
il n'y a pas de dilemme. cette réponse n'est pas basée sur la ressource définie comme dans le rfc associé. voir mon commentaire sous @LegoStormtroopr answer.
Imel96
@ imel96: Je pense que vous interprétez mal la RFC 1630: le paragraphe que vous citez dans votre commentaire précédent se lit comme suit: "Le point d'interrogation ("? ", ASCII 3F hex) est utilisé pour délimiter la limite entre l'URI d'un objet interrogeable objet, et un ensemble de mots utilisés pour exprimer une requête sur cet objet. Lorsque cette forme est utilisée, l'URI combiné représente l'objet qui résulte de la requête étant appliqués à l'objet original. " (non souligné). Ainsi, il est clair que la chaîne de requête fait bien partie de l'URI (même si la partie précédant la chaîne de requête est nécessairement également une
adresse
... et que cet URI combiné identifie une ressource spécifique que le client peut demander en envoyant cet URI au serveur. Dans tous les cas, RFC 2616 (HTTP) définit simplement une ressource comme "un objet ou un service de données réseau identifiable par un URI, comme défini dans la section 3.2". et poursuit en indiquant que "En ce qui concerne HTTP, les identificateurs de ressources uniformes sont simplement des chaînes formatées qui identifient - via un nom, un emplacement ou toute autre caractéristique - une ressource."
Ilmari Karonen
@IlmariKaronen vous avez raison. J'ai confondu HTTP avec REST. Cela ne semble toujours pas correct, car je ne suis pas sûr de ce que vous pouvez faire avec une ressource avec un URI comme / GoalTree / Get? VersionDate = 2000BC
imel96
3

Que diriez-vous d'un 204 sans contenu? Cela suggérerait que votre demande a été traitée avec succès mais ne renvoie rien. C'est toujours un "succès" mais vous permet de voir si vous avez des résultats basés uniquement sur le code d'état.

modernserf
la source
6
si vous lisez la spécification plus loin, "Cette réponse est principalement destinée à permettre la saisie d'actions sans provoquer de modification de la vue de document active de l'agent d'utilisateur". Donc, il ne devrait pas être utilisé pour les demandes GET.
Imel96
3

Si l'URL représente une ressource qui n'a jamais existé, renvoyer 404 Introuvable

Si l'URL représente une ressource qui est une liste vide, retournez une liste vide et 200 OK.

Exemple:

{
  total: 0,
  items: []
}

Si l'URL représente une ressource qui existait auparavant, renvoyer 410 Gone.

En ce qui concerne le dialogue de Lego Stormtrooper:

Alien: Computer, please tell me all planets that humans inhabit. GET /planets?inhabitedBy=humans

Computer: 200 OK. { total: 1, items:[{name:'Earth'}] }

Alien: Computer, please tell me about Earth. GET /planets/earth

Computer: 200 OK. {name:'Earth', status: 'Mostly Harmless'}

Alien: Computer, please tell me about all planets humans inhabit, outside the asteroid belt. GET /planets?inhabitedBy=humans&distanceFromSun=lots

Computer: 200 OK. {total:0, items:[] }

Alien: Computer, please destroy Earth. DELETE /planets/earth

Computer: 204 No Content. (or 202 Accepted if it takes some time to destroy Earth)

Alien: Computer, please tell me about Earth. GET /planets/earth

Computer: 410 Gone

Alien: Computer, please tell me all planets that humans inhabit. GET /planets?inhabitedBy=humans

Computer: 200 OK 0 {total: 0, items:[] }

Alien: Victory for the mighty Irken Empire!
Neil McGuigan
la source
1

D'après le son, il s'agit d'une API à usage interne . Cela donne l'avantage d'utiliser le schéma qui offre le plus d' avantages , qu'il soit manuel ou non (spécification). Cela ne signifie pas complètement inventer vos propres codes de statut, mais il est correct de "plier" les règles un peu si elles sont bénéfiques.

Je suis d’accord avec votre position selon laquelle vous devriez obtenir un code d’état indiquant que quelque chose a mal tourné. C'est après tout ce que les codes d'état sont pour. Vous bénéficiez également des bibliothèques qui génèrent des exceptions / etc. sur le code d’état non-200 afin que vous n’ayez pas à vérifier explicitement (ou vous pouvez écrire votre propre wrapper qui le fait).

Je suis également d'accord avec le point de vue d'Andres F. selon lequel 500 est approprié puisque l'arbre devrait exister. Dans la pratique, j’aime séparer les erreurs de serveur en deux catégories. Quelque chose d' inattendu s'est mal passé et de quelque chose que je peux pratiquement vérifier. Cela se traduit par les codes d'état suivants,

  • 200 - Tout va bien
  • 404 - URL incorrecte
  • 409 - Quelque chose s'est mal passé
  • 500 - Une erreur inattendue s'est produite sur le serveur

Dans votre cas particulier, vous pouvez vérifier si l’arborescence existe ou non côté serveur et si elle n’y existe pas, renvoyer un 409. C’est une erreur attendue (vous savez que cela peut arriver, vous pouvez le vérifier, etc.) . 409 conflit est juste ma préférence personnelle, un 5xx peut également être approprié tant que vous pouvez vous asseoir et décider avec votre équipe.

La catégorisation de tels codes vous aide à identifier plus rapidement le type d'erreur, mais elle peut avoir des avantages dépassant l'organisation. Souvent, avec des erreurs de site Web, vous ne voulez pas que le client reçoive des erreurs inattendues, car cela peut poser un problème de sécurité et révéler des vulnérabilités. Vous renvoyez donc 500 "Une erreur s'est produite". et enregistrez l'erreur complète sur le serveur. Mais si une erreur attendue se produit en tant que 409, vous savez qu'il serait prudent de la montrer au client et vous ne serez pas obligé de les laisser dans l'ignorance de ce qui s'est passé. C’est une utilisation pratique que je peux raconter, mais il y a beaucoup de possibilités.

C'est un peu un accroc parce que vous postez ceci parce que vous ne pouvez pas être d'accord avec vos collègues, mais il semblerait que vous discutiez davantage de la sémantique et de ce qui est politiquement correct. Peu importe qui est le plus approprié, tant que vous pouvez créer un système qui profite le plus à l'entreprise.

Par contre, s’il s’agissait d’une API publique respectant les spécifications au plus près, ce serait plus important pour éviter toute confusion au sein de la communauté.

Despertar
la source
0

Tentative tangentielle: Si un utilisateur utilise finalement l’API (via une interface graphique), je vous conseillerais de faire tout ce qui facilite la vie de l’utilisateur final. La non-existence de l’arbre au moment où il devrait exister est une erreur "Incohérence du modèle de domaine". Une erreur système survient lorsque vous manquez de mémoire ou avez eu une autre défaillance système. Donc, retourner 5xx est inapproprié. Comme mentionné par plusieurs personnes ci-dessus, 4xx pourrait être approprié si l'arbre lui-même avait son propre URI, ce qui n'est pas le cas ici. Mais voici ce que 404 dit au client: vous pouvez essayer encore et encore jusqu'à ce que vous obteniez quelque chose en retour. Si vous avez renvoyé 200, vous pouvez renvoyer un nombre suffisant de diagnostics à l'utilisateur ou à l'agent d'utilisateur afin que celui-ci puisse afficher un message afin que l'utilisateur cesse de réessayer et contacte uniquement le support. D'autre part, si cette API est destinée uniquement aux systèmes,

utilisateur90766
la source
Tout ce que 404 dit vraiment, c'est "cette chose n'est pas là et je ne sais pas où elle se trouve". 3xx et 5xx sont acceptables pour une nouvelle tentative. Mais 4xx dit, "votre requête actuelle était insuffisante pour que je puisse trouver quelque chose pour vous. Veuillez vous en aller."
J'aime la possibilité de faire la distinction entre l'URL NON TROUVEE et la ressource NON TROUVE ... Ainsi, le point de terminaison du service est opérationnel et en cours d'exécution 200, mais la ressource demandée n'est PAS TROUVÉE 404 (corps de réponse).
Limonade