Est-ce mal de retour 202 “Accepté” en réponse à HTTP GET?
J'ai un ensemble de ressources dont les représentations sont paresseusement créé. Le calcul de construire ces représentations peuvent prendre n'importe où de quelques millisecondes à quelques heures, en fonction de la charge du serveur, les ressources, et la phase de la lune.
La première demande reçue de la ressource commence le calcul sur le serveur. Si le calcul se termine dans quelques secondes, le calcul de la représentation est retourné. Sinon, une 202 statut "Accepté" le code est retourné, et le client doit interroger la ressource jusqu'à la représentation finale est disponible.
La raison de ce comportement est le suivant: Si un résultat est disponible dans un délai de quelques secondes, il doit être récupéré dès que possible; sinon, quand il devient disponible n'est pas important.
En raison de la limitation de la mémoire et le volume de demandes, ni NIO, ni le temps d'interrogation est une option (c'est à dire je ne peux pas garder près de suffisamment de connexions ouvertes, ni même je peut même s'adapter à toutes les demandes dans la mémoire, une fois que "quelques secondes" ont passé, je persiste, l'excès de demande). De même, le client limitations sont tels qu'ils ne peuvent pas gérer un rappel d'achèvement, à la place. Enfin, notez que je ne suis pas intéressé par la création d'une "usine" de ressources que l'un des Postes, que des allers-retours font que nous ne le par morceaux en temps réel contrainte de plus que ce qui est souhaité (d'ailleurs, c'est extra complexité; aussi, c'est une ressource qui serait à l'avantage de la mise en cache).
J'imagine que il ya une certaine controverse sur le retour d'un 202 statut "Accepté" code en réponse à une requête GET, vu que je n'ai jamais vu cela en pratique, et son utilisation est plus intuitive, en réponse à des méthodes dangereuses, mais je n'ai jamais trouvé quoi que ce soit de décourager. De plus, je ne suis pas à préserver à la fois la sécurité et l'idempotence?
Donc, ce que les gens pensent à propos de cette approche?
MODIFIER: je dois mentionner que c'est pour une entreprise web API--pas pour les navigateurs.
- Personnellement, je pense que c'est une bonne idée, c'est exactement la définition d'un
202
. Qu'il est rarement utilisé dans la pratique est à mon humble avis plus parce que quelques webdevelopers de soins sur le fonctionnement correct des codes de statut car ils sont plus utilisés pour navigateur / user-agent de l'interaction dans ce cas, un202
donne aucun indice visible (leur donner un200
et ils sont heureux...). - utilisez simplement
200
.202
est ce qu'il est censé être, mais dans la pratique, les gens ne vous attendez pas202
. - il a besoin d'un visa pour un 200 pour être utile dans la pratique cependant.
Vous devez vous connecter pour publier un commentaire.
Si c'est pour un bien défini et documenté de l'API,
202
sons exactement droit pour ce qui se passe.Si c'est pour le public de l'Internet, je ne serais pas trop inquiet au sujet de la compatibilité client. J'ai vu beaucoup
if (status == 200)
codée en dur.... Dans ce cas, je voudrais revenir un200
.Aussi, le RFC ne donne aucune indication que l'utilisation de 202 pour une requête GET est mauvais, alors qu'il fait une distinction claire dans d'autres descriptions de code (par exemple, 200).
Nous l'avons fait pour une application récente, un client (application personnalisée, pas un navigateur) POST ed d'une requête et le serveur serait de retour 202 avec un URI pour le "travail" d'être publié - le client serait l'utilisation d'URI pour vérifier le résultat - ce qui semble parfaitement avec ce qui avait été fait.
La chose la plus importante ici est de toute façon de documenter la façon dont votre service/API travaille, et qu'une réponse de 202 moyens.
De ce que je peux rappeler - GET est censé renvoyer à une ressource sans modifier le serveur. Peut-être que l'activité sera connecté ou qu'avez-vous, mais la demande doit être rerunnable avec le même résultat.
POST sur l'autre main est une demande pour modifier l'état de quelque chose sur le serveur. Insérer un enregistrement supprimer un enregistrement, d'exécuter une tâche, quelque chose comme ça. 202 serait approprié pour un POST qui a retourné mais ce n'est pas fini, mais pas vraiment d'une requête GET.
C'est très puritaine et pas bien pratiqué dans la nature, alors vous êtes probablement plus sûr, en retournant 202. OBTENEZ devrait rendement de 200. Le POST peut revenir 200 si il fini ou 202 si elle ne se fait pas.
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
Dans le cas d'une ressource qui est censé avoir une représentation d'une entité qui est clairement défini par un IDENTIFIANT (par opposition à une "usine" de la ressource, comme décrit dans la question), je vous recommande de rester avec la méthode GET et, dans une situation où l'entité/représentation n'est pas disponible en raison de paresseux, de création ou de toute autre situation temporaire, utiliser le 503 Service non disponible code de réponse qui est plus approprié et a été effectivement conçu pour des situations comme celle-ci.
Raisonnement pour ce qui peut être trouvé dans les Rfc pour HTTP lui-même (veuillez vérifier la description de la réponse 503 du code), ainsi que sur de nombreuses autres ressources.
Veuillez comparer avec Le code d'état HTTP temporairement indisponible pages. Bien que cette question est sur un autre cas d'utilisation, il se rapporte en fait à la même fonction de HTTP.