web-dev-qa-db-fra.com

Code de statut HTTP pour une requête partiellement réussie

J'ai une application qui envoie des messages aux utilisateurs. Dans une demande de publication, une chaîne XML est transférée, composée de tous les utilisateurs devant recevoir ce message particulier. Si l'un des utilisateurs de la liste n'existe pas, je renvoie la liste des utilisateurs manquants au client pour une évaluation ultérieure. 

Maintenant, je me demande quel serait le code de statut approprié pour la demande en indiquant que la demande avait été acceptée, mais que certaines choses ne pouvaient pas être effectuées. 

Le problème serait évité s'il n'était pas autorisé à inclure les utilisateurs manquants dans la liste. Ensuite, la tentative d’envoi aurait juste une erreur 4xx. Mais il ne sert à rien de former l'API de cette façon… .. D'un autre côté, je pourrais considérer que la condition d'erreur est purement spécifique à l'application. Mais envoyer un 200 ne me semble pas juste. Et il serait bien de donner au client un indice lorsqu'il faut examiner la réponse d'erreur en profondeur. par exemple. pour éviter d'envoyer des messages à ces utilisateurs encore et encore

82
Norbert Hartl

J'ai traité d'un problème très similaire. Dans ce cas, je suis retourné un 

207 Multi-Status

Maintenant, ce n'est pas HTTP strict, cela fait partie de l'extension WebDAV, donc si vous n'avez pas le contrôle du client aussi, alors ce n'est pas bon pour vous. Si vous le faites, vous pouvez faire quelque chose comme ça:

   <?xml version="1.0" encoding="utf-8" ?>
   <D:multistatus xmlns:D='DAV:'>
     <D:response>
       <D:user>user-123</D:user>
       <D:status>success</D:status>
     </D:response>
     <D:response>
       <D:user>user-789</D:user>
       <D:status>failure</D:status>
     </D:response>
   </D:multistatus>

Mais là encore, il s’agit d’une extension HTTP et vous devez également avoir le contrôle du client.

48
Kylar

J'ai eu le même problème et j'ai finalement utilisé deux solutions différentes:

  • Code de retour HTTP 202: Accepted, indiquant que la demande a été acceptée, mais rien ne garantit que tout s'est déroulé comme il se doit.
  • Renvoie un 200 normal dans la réponse, mais incluez une liste de ce qui n'a pas marché dans le corps de la réponse.

Le second fonctionne généralement mieux, mais le premier est idéal si vous êtes paresseux ou utilisez une file d'attente pour le traitement.

53
Arne

Qu'en est-il de l'utilisation de 206 Partial Content. Je sais que 206 est plus sur les gammes, mais si cela pouvait indiquer une demande partiellement avec succès?

0
Yusuf