D'État HTTP 202 - faire pour fournir des informations sur async achèvement de la demande?
Quel est le moyen le plus approprié de donner une estimation pour l'achèvement de la demande lorsque le serveur renvoie un 202 - Accepted
code de statut pour les requêtes asynchrones?
De la HTTP spec (italique ajouté par moi):
202 Accepté
La demande a été acceptée pour le traitement, mais le traitement n'a pas été achevée. [...]
L'entité revint avec cette réponse DOIT inclure une indication de la demande de l'état actuel et un pointeur à un moniteur d'état ou une estimation du moment où l'utilisateur peut s'attendre à la demande à remplir.
Ici sont quelques-uns des pensées:
- J'ai jeté un coup d'oeil à la max-age directive, mais en utilisant ce serait abuser de
Cache-Control
? - Rendement attendus sur les temps d'attente dans le corps de la réponse?
- Ajouter une application spécifique
X-
en-tête de réponse, mais laX-
en-têtes a été dépréciée en RFC 6648? - Ajouter une (non
X-
) spécifique à en-tête de réponse? Si oui, comment doit-il être nommé? La DONC, la question En-têtes HTTP personnalisés : les conventions de nommage a donné quelques idées, mais après le retrait, il ne répond comment les en-têtes HTTP sont mis en forme, pas la façon dont ils doivent être nommés. - D'autres suggestions?
Vous devez vous connecter pour publier un commentaire.
Certainement ne pas l'abus existants en-têtes HTTP pour cela. Puisque c'est votre propre serveur, vous devez définir ce que la réponse ressemble. Vous pouvez (et devez) choisir quelle que soit la réponse qui fonctionne le mieux pour le destinataire de cette information et de retour de l'information réelle dans le corps de la réponse.
Par exemple, si vous êtes uniquement intéressé par l'affichage d'un message lisible ensuite, vous pouvez retourner
text/plain
en disant: "Votre demande est susceptible d'être traité dans les 30 prochaines minutes.".À l'autre extrémité du spectre, vous pouvez aller de tout le RESTE du chemin et de retourner
application/json
, peut-être formaté comme ceci (j'ai totalement faite sur place):Vous pouvez utiliser le
Location
- tête pour spécifier l'URL du moniteur d'état. Des choses comme la situation actuelle et d'estimer pouvez soit aller dans les en-têtes personnalisés (que personne d'autre que votre propre logiciel de l'utilisation), ou dans le corps de la réponse (qui d'un navigateur web afficher à un utilisateur, au moins).Location
en-tête. Très probablement, nous allons utiliser une réponse personnalisée à corps.Location
en-tête HTTP 202 en PHP, parce qu'il applique spécial de la sémantique par la RFC 2616, cf. php.net/manual/en/function.header.php "de La deuxième spéciale est le cas de la "location:". Non seulement est-il envoyer cet en-tête en arrière pour le navigateur, mais il renvoie également à une REDIRECTION (302) code d'état du navigateur, à moins que le 201 ou un 3xx code d'état a déjà été définie."Location
d'être utilisés dans les 202 (ou toute autre réponse), il définit simplement ce queLocation
se réfère en cas de 201/3xx. C'est donc un PHP sémantique (ou bug, selon la façon dont vous le regardez), pas un HTTP sémantique.Location
en-tête HTTP 202 en PHP" - le commentaire sur bugs.php.net/bug.php?id=70273 à partir de jeff à 2015-08-17 16:35 UTC montre plusieurs façons d'accomplir cela en PHP.header('Location: ...')
avecheader('Location: ...', true, 202)
est à peine une bidouille.header('HTTP/1.1 202 Accepted')
de ne pas avoir été piétiné plus, en fonction de la commande (!)Bien que n'étant pas explicitement mentionné spécifiquement pour le
202 - Accepted
code de réponse, l'Retry-After
en-tête semble être une bonne option. À partir de la la documentation:X-Retry-After
- tête avec des valeurs en millisecondes par exemple être plus approprié à la place?Retry-After: 0
, au lieu d'inventer un en-tête personnalisé car au moment où le client reçoit la réponse de quelques millisecondes serait passé de toute façon et ils peuvent réessayer tout de suite. Dans le cas d'une opération asynchrone,Retry-After: 0
semble dire "le résultat n'est pas encore prêt, mais n'hésitez pas à demander à nouveau (à chaque fois que vous le souhaitez)."Retry-After
n'est pas fait pour ça. Je pense queRetry-After
est légitime d'informer interdit aux utilisateurs de quand ils peuvent réessayer, mais je ne vois pas la nécessité de la sous-deuxième précision dans ce cas. En général, les utilisateurs d'être banni pendant des heures à la fois.