web-dev-qa-db-fra.com

Code d'état HTTP pour l'erreur de dépendance externe

Quel est le code d'état HTTP correct à renvoyer lorsqu'un serveur rencontre des problèmes de communication avec une API externe?

Supposons qu'un client envoie une demande valide à mon serveur A, A puis interroge l'API du serveur B afin de faire quelque chose. Cependant, l'API de B lance actuellement 500 ou est en quelque sorte inaccessible, quel code d'état A doit-il retourner au client? Une erreur 5 * ne semble pas correcte car le serveur A fonctionne comme il se doit et une erreur 4 * ne semble pas correcte car le client envoie une demande valide à A.

26
rectangletangle

Étant donné que l'API repose sur quelque chose qui n'est pas disponible, son service n'est pas disponible également.

Je pense que le code d'état 503: Service non disponible est le mieux adapté à votre situation. De la description RFC :

Le serveur n'est actuellement pas en mesure de traiter la demande en raison d'une surcharge ou d'une maintenance temporaire du serveur. L'implication est qu'il s'agit d'une condition temporaire qui sera atténuée après un certain retard. Si elle est connue, la longueur du retard PEUT être indiquée dans un en-tête Retry-After. Si aucune nouvelle tentative n'est donnée, le client DEVRAIT traiter la réponse comme il le ferait pour une réponse 500.

Certes, la description implique que ce code d'état doit être appliqué pour les erreurs sur le serveur lui-même (et non pour signaler un problème avec une dépendance externe). Cependant, c'est le meilleur ajustement dans les codes d'état RFC, et je ne suggère pas d'utiliser des codes d'état personnalisés pour que tout le monde puisse les comprendre.

Alternativement, si votre API prend en charge un moyen de communiquer des erreurs (par exemple pour dire à l'utilisateur que l'ID qu'il a fourni est incorrect), vous pouvez utiliser cette méthode pour dire à l'utilisateur que la dépendance n'est pas disponible. Cela pourrait être un peu plus convivial et pourrait éviter une recherche de bogues du côté de l'utilisateur, car au moins certains des utilisateurs ne connaissent aucun code d'état en dehors de 403, 404 et peut-être 500, selon votre public.

24
ljacqu

Avez-vous envisagé les codes d'état 502 et 504 ?

502 – The server while acting as a gateway or a proxy, 
received an invalid response from the upstream server it accessed
in attempting to fulfill the request.

504 – The server, while acting as a gateway or proxy, 
did not receive a timely response from the upstream server 
specified by the URI (e.g. HTTP, FTP, LDAP) 
or some other auxiliary server (e.g. DNS) it needed to access 
in attempting to complete the request.

Bien entendu, cela nécessiterait une interprétation large de la "passerelle" (implémentation de l'interface A nécessitant un appel à l'interface B), appliquée à la couche application. Mais cela pourrait être une belle façon de dire: "Je ne peux pas répondre mais ce n'est ni ma faute ni la vôtre".

29
Aurélien

Vous pouvez renvoyer ce lien.

Statut HTTP 424 ou 500 pour erreur sur dépendance externe

Le service 503 non disponible semble parfait pour la situation.

2
user636856