web-dev-qa-db-fra.com

REST Traitement du code d'erreur 500 de l'API

Nous construisons une nouvelle API REST.

Je disais que le code d'erreur 500 (Erreur interne du serveur) ne devrait jamais être renvoyé.

Maintenant, bien sûr, si vous savez que les paramètres du client sont incorrects ou quelque chose que vous avez tout sous contrôle et que vous pouvez renvoyer un code d'erreur approprié (par exemple 422).

Donc, si une erreur inattendue se produit, le serveur peut:

  1. NE PAS attraper les erreurs inattendues de sorte que 500 bulles soient envoyées au client
  2. Attrapez les erreurs inattendues et renvoyez un code d'erreur signalant une "situation inattendue" (honnêtement, je ne pouvais pas trouver un tel code d'erreur!)

Y a-t-il d'autres options?

11
faboolous

C'est une erreur de serveur, pas une erreur de client. Si les erreurs de serveur ne devaient pas être renvoyées au client, aucune classe de code de statut n’aurait été créée pour elles (c.-à-d. 5xx).

Vous ne pouvez pas cacher le fait que vous avez commis une erreur de programmation ou que certains services sur lesquels vous comptez ne sont pas disponibles et que ce n'est certainement pas la faute du client. Renvoyer une autre plage de code dans ces cas que la série 5xx n'aurait aucun sens.

La RFC 7231 mentionne dans la section 6.6. Erreur de serveur 5xx :

La classe de code de statut 5xx (erreur de serveur) indique que le serveur est conscient qu'il a commis une erreur ou est incapable d'exécuter le méthode demandée.

C'est exactement le cas. Il n'y a rien "interne" dans le code "500 Internal Server Error" en ce sens qu'il ne devrait pas être exposé au client. 

13
CodeCaster

La vraie question est pourquoi génère-t-il une erreur de 500? S'il est lié à des paramètres d'entrée, je dirais qu'il devrait être traité en interne et renvoyé sous forme d'erreur 400. Généralement, un 400, 404 ou 406 serait approprié pour refléter une mauvaise entrée car la convention générale est qu'une ressource RESTful est identifiée de manière unique par l'URL et qu'une URL qui ne peut pas générer une réponse valide est une requête incorrecte (400) ou similaire.

Si l'erreur est causée par autre chose que les entrées fournies explicitement ou implicitement par la demande, je dirais qu'une erreur de 500 est probablement appropriée. Ainsi, une connexion échouée à une base de données ou une autre erreur imprévisible est précisément représentée par une erreur série 500.

5
tokkov

Vous avez suggéré "Résoudre les erreurs inattendues et renvoyer un code d'erreur signalant" une situation inattendue "", mais vous n'avez pas trouvé le code d'erreur approprié. 

Devinez quoi: C’est la raison pour laquelle 5xx est là. 

3
gnasher729

En règle générale, les codes de réponse 5xx indiquent des échecs non programmés, tels qu'un échec de connexion à une base de données ou un autre échec de dépendance système/bibliothèque. Dans de nombreux cas, le client peut à nouveau soumettre la même demande à l'avenir et s'attendre à ce qu'il aboutisse.

Oui, certains frameworks Web vont répondre avec des codes 5xx, mais ceux-ci sont généralement le résultat de défauts dans le code et le framework est trop abstrait pour savoir ce qui s'est passé. Par conséquent, ce type de réponse est utilisé par défaut. Cet exemple, cependant, ne signifie pas que nous devrions avoir l'habitude de renvoyer des codes 5xx à la suite d'un comportement programmatique indépendant des systèmes hors processus. Il existe de nombreux codes de réponse bien définis qui conviennent mieux que les codes 5xx. L'impossibilité d'analyser/valider une entrée donnée n'est pas une réponse 5xx, car le code peut contenir une réponse plus appropriée qui ne laissera pas le client penser qu'il peut soumettre à nouveau la même demande, alors qu'en réalité il ne le peut pas.

Pour être clair, si l'erreur rencontrée par le serveur était due à l'entrée CLIENT, il s'agit clairement d'une erreur CLIENT et doit être traitée avec un code de réponse 4xx. On s'attend à ce que le client corrige l'erreur dans sa demande et le soumette à nouveau.

Cependant, il est tout à fait acceptable de détecter les erreurs de processus et de les interpréter comme une réponse 5xx, mais sachez que vous devez également inclure des informations supplémentaires dans la réponse pour indiquer exactement ce qui a échoué. et encore mieux si vous pouvez inclure SLA fois à l'adresse.

Je ne pense pas que ce soit une bonne pratique d'interpréter "une erreur inattendue" comme une erreur 5xx car des bugs surviennent.

Il est courant que des alertes soient lancées sur des types d’erreurs de type 5xx, car ils indiquent généralement des systèmes défaillants plutôt que du code défaillant. Alors, code en conséquence!

2
ILoveCode

80% des fois, cela serait dû à une mauvaise saisie dans soapRequest.xml file

0
harveySp