HTTP 202 accepté (HTTP / 1.1)
Vous recherchez un HTTP 202 Accepted
statut. Voir RFC 2616 :
La demande a été acceptée pour traitement, mais le traitement n'est pas terminé.
Traitement HTTP 102 (WebDAV)
La RFC 2518 suggère d'utiliser HTTP 102 Processing
:
Le code de statut 102 (Traitement) est une réponse provisoire utilisée pour informer le client que le serveur a accepté la demande complète mais ne l'a pas encore terminée.
mais il y a une mise en garde:
Le serveur DOIT envoyer une réponse finale une fois la demande complétée.
Je ne sais pas comment interpréter la dernière phrase. Le serveur doit-il éviter d’envoyer quoi que ce soit pendant le traitement et ne répondre qu’après l’achèvement? Ou cela oblige-t-il uniquement à mettre fin à la réponse lorsque le traitement est terminé? Cela peut être utile si vous souhaitez signaler les progrès. Envoyez HTTP 102 et purgez la réponse octet par octet (ou ligne par ligne).
Par exemple, pour un processus long mais linéaire, vous pouvez envoyer cent points, après chaque caractère. Si le côté client (tel qu'une application JavaScript) sait qu'il doit s'attendre à exactement 100 caractères, il peut le faire correspondre à une barre de progression à afficher à l'utilisateur.
Un autre exemple concerne un processus qui comprend plusieurs étapes non linéaires. Après chaque étape, vous pouvez vider un message de journal qui sera éventuellement affiché à l'utilisateur, afin que l'utilisateur final puisse savoir comment le processus se déroule.
Problèmes avec le rinçage progressif
Notez que si cette technique a ses avantages, je ne la recommanderais pas . L'une des raisons est que cela force la connexion à rester ouverte, ce qui pourrait nuire à la disponibilité du service et ne pas être à la hauteur.
Une meilleure approche consiste à répondre avec HTTP 202 Accepted
, soit à laisser l'utilisateur de vous contacter ultérieurement pour déterminer si le traitement est terminé (par exemple, en appelant de manière répétée un URI donné tel que celui /process/result
qui répondrait avec HTTP 404 non trouvé ou HTTP 409 en conflit jusqu'au traitement se termine et que le résultat est prêt), ou informe l'utilisateur lorsque le traitement est terminé si vous êtes en mesure de rappeler le client, par exemple, via un service de file d'attente de messages ( exemple ) ou WebSockets.
Exemple pratique
Imaginez un service Web qui convertit des vidéos. Le point d'entrée est:
POST /video/convert
qui prend un fichier vidéo de la requête HTTP et fait un peu de magie avec elle. Imaginons que la magie consomme beaucoup de ressources processeur et que cela ne puisse se faire en temps réel pendant le transfert de la requête. Cela signifie qu'une fois le fichier transféré, le serveur répondra par un HTTP 202 Accepted
contenu JSON, ce qui signifie «Oui, j'ai votre vidéo et je travaille dessus; il sera prêt quelque part dans le futur et sera disponible via l'ID 123. »
Le client a la possibilité de s'abonner à une file de messages pour être averti à la fin du traitement. Une fois l’opération terminée, le client peut télécharger la vidéo traitée en allant sur:
GET /video/download/123
qui mène à un HTTP 200
.
Que se passe-t-il si le client interroge cet URI avant de recevoir la notification? Eh bien, le serveur répondra avec, HTTP 404
puisque la vidéo n’existe pas encore. Il peut être actuellement préparé. Cela n'a peut-être jamais été demandé. Il peut exister quelque temps dans le passé et être supprimé plus tard. Tout ce qui compte, c'est que la vidéo obtenue ne soit pas disponible.
Maintenant, que se passe-t-il si le client se soucie non seulement de la vidéo finale, mais également de la progression (ce qui serait encore plus important s'il n'y avait pas de service de file d'attente de messages ou un mécanisme similaire)?
Dans ce cas, vous pouvez utiliser un autre noeud final:
GET /video/status/123
ce qui entraînerait une réponse semblable à ceci:
HTTP 200
{
"id": 123,
"status": "queued",
"priority": 2,
"progress-percent": 0,
"submitted-utc-time": "2016-04-19T13:59:22"
}
Si vous faites la demande encore et encore, vous verrez les progrès jusqu'à ce que:
HTTP 200
{
"id": 123,
"status": "done",
"progress-percent": 100,
"submitted-utc-time": "2016-04-19T13:59:22"
}
Il est essentiel de faire la différence entre ces trois types de demandes:
POST /video/convert
met en file d'attente une tâche. Il ne devrait être appelé qu'une seule fois: un nouvel appel mettrait en attente une tâche supplémentaire.
GET /video/download/123
concerne le résultat de l'opération: la ressource est la vidéo. Le traitement — c'est ce qui s'est passé sous le capot pour préparer le résultat réel avant la demande et indépendamment pour la demande — est sans importance ici. Il peut être appelé une ou plusieurs fois.
GET /video/status/123
concerne le traitement en soi . Il ne fait rien faire la queue. Il se fiche de la vidéo résultante. La ressource est le traitement lui-même. Il peut être appelé une ou plusieurs fois.