HTTP 202 accettato (HTTP / 1.1)
Stai cercando lo stato HTTP 202 Accepted
. Vedi RFC 2616 :
The request has been accepted for processing, but the processing has not been completed.
Elaborazione HTTP 102 (WebDAV)
RFC 2518 suggerisce di utilizzare HTTP 102 Processing
:
The 102 (Processing) status code is an interim response used to
inform the client that the server has accepted the complete request,
but has not yet completed it.
ma ha un avvertimento:
The server MUST send a final response after the request has been completed.
Non sono sicuro di come interpretare l'ultima frase. Il server dovrebbe evitare di inviare qualcosa durante l'elaborazione e rispondere solo dopo al completamento? O costringe solo a terminare la risposta solo quando l'elaborazione termina? Questo potrebbe essere utile se vuoi segnalare i progressi. Invia HTTP 102 e svuota la risposta byte per byte (o riga per riga).
Ad esempio, per un processo lungo ma lineare, puoi inviare cento punti, sciacquando ogni carattere. Se il lato client (come un'applicazione JavaScript) sa che dovrebbe aspettarsi esattamente 100 caratteri, può abbinarlo con una barra di avanzamento da mostrare all'utente.
Un altro esempio riguarda un processo che consiste in diversi passaggi non lineari. Dopo ogni passaggio, puoi svuotare un messaggio di log che verrebbe visualizzato all'utente, in modo che l'utente finale possa sapere come sta andando il processo.
Problemi con lo spurgo progressivo
Nota che mentre questa tecnica ha i suoi meriti, non la consiglierei . Uno dei motivi è che costringe la connessione a rimanere aperta, il che potrebbe danneggiare in termini di disponibilità del servizio e non si adatta bene.
Un approccio migliore consiste nel rispondere con HTTP 202 Accepted
e consentire all'utente di tornare in un secondo momento per determinare se l'elaborazione è terminata (ad esempio chiamando ripetutamente un dato URI come /process/result
che risponderebbe con HTTP 404 Non trovato o Conflitto HTTP 409 fino a quando il processo termina e il risultato è pronto), o avvisare l'utente quando l'elaborazione viene eseguita se è possibile richiamare il client, ad esempio, tramite un servizio di accodamento messaggi ( esempio ) o WebSockets.
Esempio pratico
Immagina un servizio Web che converte i video. Il punto di ingresso è:
POST /video/convert
che prende un file video dalla richiesta HTTP e fa un po 'di magia con esso. Immaginiamo che la magia abbia un uso intensivo della CPU, quindi non può essere eseguita in tempo reale durante il trasferimento della richiesta. Ciò significa che una volta trasferito il file, il server risponderà con una HTTP 202 Accepted
con alcuni contenuti JSON, che significa "Sì, ho ricevuto il tuo video e ci sto lavorando; sarà pronto da qualche parte in futuro e sarà disponibile attraverso l'ID 123. "
Il client ha la possibilità di iscriversi a una coda di messaggi per essere avvisati al termine dell'elaborazione. Al termine, il client può scaricare il video elaborato andando a:
GET /video/download/123
che porta a HTTP 200
.
Cosa succede se il client interroga questo URI prima di ricevere la notifica? Bene, il server risponderà con HTTP 404
poiché, in effetti, il video non esiste ancora. Potrebbe essere attualmente preparato. Potrebbe non essere mai stato richiesto. Potrebbe esistere un po 'di tempo in passato e essere rimosso in seguito. Tutto ciò che conta è che il video risultante non sia disponibile.
Ora, che cosa succede se al cliente importa non solo il video finale, ma anche il progresso (che sarebbe ancora più importante se non ci sono servizi di code messaggi o meccanismi simili)?
In questo caso, puoi usare un altro endpoint:
GET /video/status/123
che risulterebbe in una risposta simile a questa:
HTTP 200
{
"id": 123,
"status": "queued",
"priority": 2,
"progress-percent": 0,
"submitted-utc-time": "2016-04-19T13:59:22"
}
Facendo ripetutamente la richiesta mostrerai i progressi finché non sarà:
HTTP 200
{
"id": 123,
"status": "done",
"progress-percent": 100,
"submitted-utc-time": "2016-04-19T13:59:22"
}
È fondamentale fare la differenza tra questi tre tipi di richieste:
-
POST /video/convert
mette in coda un'attività. Dovrebbe essere chiamato una sola volta: chiamandolo di nuovo si accoderebbe un'ulteriore attività.
-
GET /video/download/123
riguarda il risultato dell'operazione: la risorsa è il video. L'elaborazione, ovvero ciò che è accaduto sotto il cofano per preparare il risultato effettivo prima della richiesta e indipendentemente dalla richiesta, è irrilevante qui. Può essere chiamato una o più volte.
-
GET /video/status/123
riguarda l'elaborazione di per sé . Non fa la coda nulla. Non interessa il video risultante. La risorsa è l'elaborazione stessa. Può essere chiamato una o più volte.