HTTP 202 accettato (HTTP / 1.1)
Stai cercando lo HTTP 202 Accepted
stato. Vedi RFC 2616 :
La richiesta è stata accettata per l'elaborazione, ma l'elaborazione non è stata completata.
Elaborazione HTTP 102 (WebDAV)
RFC 2518 suggerisce di utilizzare HTTP 102 Processing
:
Il codice di stato 102 (Elaborazione) è una risposta temporanea utilizzata per informare il client che il server ha accettato la richiesta completa, ma non l'ha ancora completata.
ma ha un avvertimento:
Il server DEVE inviare una risposta finale dopo il completamento della richiesta.
Non sono sicuro di come interpretare l'ultima frase. Il server dovrebbe evitare di inviare qualcosa durante l'elaborazione e rispondere solo dopo il completamento? O forza solo a terminare la risposta solo al termine dell'elaborazione? Questo potrebbe essere utile se vuoi segnalare i progressi. Invia HTTP 102 e scarica la risposta byte per byte (o riga per riga).
Ad esempio, per un processo lungo ma lineare, puoi inviare cento punti, arrossendo dopo ogni carattere. Se il lato client (come un'applicazione JavaScript) sa che dovrebbe aspettarsi esattamente 100 caratteri, può abbinarlo a una barra di avanzamento da mostrare all'utente.
Un altro esempio riguarda un processo che consiste in diversi passaggi non lineari. Dopo ogni passaggio, è possibile svuotare un messaggio di registro che verrà eventualmente visualizzato all'utente, in modo che l'utente finale possa sapere come sta andando il processo.
Problemi con lavaggio progressivo
Nota che mentre questa tecnica ha i suoi meriti, non la consiglierei . Uno dei motivi è che forza la connessione a rimanere aperta, il che potrebbe nuocere in termini di disponibilità del servizio e non si adatta bene.
Un approccio migliore è rispondere HTTP 202 Accepted
e consentire all'utente di ricontattarti in un secondo momento per determinare se l'elaborazione è terminata (ad esempio chiamando ripetutamente un determinato URI come quello /process/result
che risponderebbe con HTTP 404 non trovato o HTTP 409 conflitto fino al processo termina e il risultato è pronto) oppure avvisa l'utente al termine dell'elaborazione se è possibile richiamare il client, ad esempio tramite un servizio di coda messaggi ( esempio ) o WebSocket.
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 richieda un utilizzo 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 un HTTP 202 Accepted
contenuto JSON, il che significa "Sì, ho il tuo video e ci sto lavorando; sarà pronto da qualche parte in futuro e sarà disponibile tramite l'ID 123. "
Il client ha la possibilità di abbonarsi a una coda di messaggi per ricevere una notifica al termine dell'elaborazione. Al termine, il client può scaricare il video elaborato andando a:
GET /video/download/123
che porta a un HTTP 200
.
Cosa succede se il client richiede questo URI prima di ricevere la notifica? Bene, il server risponderà HTTP 404
poiché, in effetti, il video non esiste ancora. Al momento potrebbe essere preparato. Potrebbe non essere mai stato richiesto. Potrebbe esistere qualche tempo nel passato ed essere rimosso in seguito. Tutto ciò che conta è che il video risultante non è disponibile.
Ora, cosa succede se al cliente interessa non solo il video finale, ma anche i progressi (che sarebbe ancora più importante se non ci fosse un servizio di coda messaggi o un meccanismo simile)?
In questo caso, è possibile utilizzare un altro endpoint:
GET /video/status/123
che darebbe una risposta simile a questa:
HTTP 200
{
"id": 123,
"status": "queued",
"priority": 2,
"progress-percent": 0,
"submitted-utc-time": "2016-04-19T13:59:22"
}
Eseguendo la richiesta più e più volte mostrerà l'avanzamento fino a quando 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 solo una volta: richiamarlo avrebbe messo in coda un'attività aggiuntiva.
GET /video/download/123
riguarda il risultato dell'operazione: la risorsa è il video. L'elaborazione - questo è 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 il trattamento in sé . Non mette in coda nulla. Non importa del video risultante. La risorsa è l'elaborazione stessa. Può essere chiamato una o più volte.