Je développe une API RESTful dans laquelle http://server/thingyapi/thingyblob/1234
retourne le fichier (aka "blob") associé à thingy # 1234 à télécharger. Mais il se peut que la demande soit faite à un moment où le fichier n'existe pas sur le serveur, mais il sera certainement disponible ultérieurement. Il y a un processus par lots dans le serveur qui génère tous les blobs pour tous les trucs. Thingy 1234 existe déjà et ses données, autres que le blob, sont déjà disponibles. Le serveur n'a pas encore généré le blob de thingy 1234.
Je ne veux pas retourner 404; c'est pour des trucs qui n'existent pas. C'est une chose qui existe, mais son blob n'a pas encore été généré. Un peu comme une vidéo YouTube qui est en "traitement". Je ne pense pas non plus que les codes de redirection seraient appropriés; il n'y a pas "d'autre" URL à essayer.
Quel est le code d'état HTTP correct à renvoyer dans un tel cas?
204
"Aucun contenu"? Est indique que le serveur a traité avec succès la demande et ne renvoie aucun contenu [pour le moment].Réponses:
Je suggère
202 - Accepted
. De la documentation :la source
Le "problème", tel qu'il est, est côté serveur: le client a fait une requête bien formée, mais le serveur ne peut pas la satisfaire. Je suis donc enclin à une "Erreur de serveur", code d'état 5xx.
Quoth RFC 7231 (la norme HTTP actuelle, emphase ajoutée):
Remarque
Parmi les codes disponibles, je dirais 503, «Service indisponible» était le meilleur choix:
Remarque:
Retry-After
valeur. Vous pouvez fournir comme valeur le temps d'exécution estimé de la prochaine exécution du traitement par lots ou l'intervalle d'exécution du traitement par lots.La définition de votre propre code d'état 5xx (591, par exemple), bien qu'autorisée , aurait la mauvaise sémantique:
Les clients traiteraient votre propre code d'état comme 500, "Erreur interne du serveur" , ce qui ne serait pas correct.
la source
307 - TEMPORARY REDIRECT
ce qui est bien si vous voulez forcer le côté client à attendre ailleurs pendant que votre ressource est "préparée"Je pense que 423 - Locked peut être utilisé à cette fin:
la source
L'URL ne correspond pas à une demande de chose.
http://server/thingyapi/thingyblob/1234
Le client demande un objet thingyblob, qui n'existe pas. S'il existait, vous le leur donneriez.
404.
la source
503
c'est une réponse appropriée. Sans parler de certaines des autres suggestions étranges.Une autre option:
503 - Service Unavailable
.la source
Puisque votre ressource n'est pas prête, vous savez probablement quand (approximativement) elle sera disponible et quand le client pourra réessayer sa demande. Cela signifie que vous souhaiterez peut-être utiliser l'en -tête Retry-After . Cet en-tête est valide avec 503 (Service non disponible), ce qui signifie que tout le site est arrêté pour maintenance, et 3xx (Redirection) réponses.
À mon avis, 302 (trouvé) avec en-tête Retry-After serait la meilleure option, mais je ne suis pas sûr si le champ Location de l'en-tête de réponse peut être égal à l'URL de la demande. C'est une redirection circulaire, de toute façon.
la source
409 Conflit
Indique que la demande n'a pas pu être traitée en raison d'un conflit dans la demande, tel qu'un conflit d'édition dans le cas de plusieurs mises à jour. [Source Wikipedia.]
Cela pourrait être approprié.
Si vous ne pouvez pas répondre à la demande en renvoyant les données, ce n'est pas un succès. Je pense que 202 suggère que le serveur a mis la demande en file d'attente et qu'il répondra à la demande plus tard. Mais dans votre cas, la demande concerne maintenant des données et a échoué. Si vous réessayez plus tard, il s'agit d'une demande différente.
Je pense que vous avez un conflit .. vous voulez les données .. mais c'est en cours d'édition / mise à jour. Ce serait également le cas si Thingy1234 existait déjà et avait été téléchargé avec succès auparavant, mais qu'il était maintenant en cours de modification, qu'il n'était pas disponible pendant la modification.
la source
501 - Non mis en œuvre
Exactement comme ça sonne. Une fonctionnalité qui n'est pas encore implémentée, mais qui implique une disponibilité future.
Voici un lien vers un résumé des erreurs 5xx .
la source