Questa è una domanda molto vecchia, ma mi piacerebbe offrire una visione leggermente diversa di questo, che non pretendo di essere corretta, solo la mia opinione.
Dal punto di vista del cliente
Partiamo subito con la richiesta HTTP iniziale. Prima di tutto, la richiesta dovrebbe essere POST. Stai inviando un messaggio al server per creare una risorsa. GET e PUT non sono validi in questo caso perché:
- Un GET non è valido in questo contesto perché un GET ha lo scopo di ottenere la risorsa in una posizione specifica
- Un PUT non è valida perché non siete creando la richiesta, stai chiedendo al server di creare la richiesta.
Dal punto di vista del servizio
Così ora si sta inviando un POST al server per elaborare una richiesta. L'assistente ha davvero 3 valori restituiti possibili (senza contare gli errori 4xx e 5xx):
- "201 Creato" indica che il servizio ha ottenuto la richiesta ed è stato in grado di elaborare immediatamente, o entro un periodo di tempo accettabile. Questo periodo di tempo è completamente in linea con la progettazione del servizio. Spetta allo sviluppatore del servizio definirlo.
- "202 Accettato" indica che il servizio ha ricevuto la richiesta e la sta elaborando. Questo è usato quando il servizio sa che ci vorrà del tempo. L'altra prospettiva è che se il servizio fa affidamento su qualsiasi altra operazione asincrona che non ha modo di determinare il risultato, allora dovrebbe restituire la risposta "202 Accettato". Infine, alcuni progettisti di servizi possono semplicemente restituire sempre "202 Accettato" indipendentemente dalla velocità con cui può essere eseguito.
- In alcuni casi, si otterrebbe un "302 trovato". Questo di solito è quando il servizio può identificare una richiesta come generare una risorsa che esiste già (ed è ancora valida e non in uno stato di errore) e che riutilizzare una risorsa esistente è accettabile. Non tutti i servizi funzionano in questo modo: la pubblicazione di un commento su un thread dovrebbe sempre creare nuove risorse. Altri servizi: pubblicare una serie di criteri per ottenere un elenco di medici produce la stessa lista di medici. Se queste informazioni possono essere riutilizzate, quindi riutilizzarle.
- Con tutte queste risposte, l'intestazione HTTP "Posizione" viene restituita al client contenente la posizione in cui è possibile trovare la risorsa.Questo è importante e dove alcune persone tendono a divergere nell'approccio, come vedremo più avanti. Se la risorsa può essere riutilizzata con altre richieste, la "Posizione" dovrebbe essere generata in modo che le stesse richieste generino sempre gli stessi URL. Ciò fornisce una buona dose di cache e riutilizzo.
Quando il servizio ha completato correttamente la richiesta, creerà la risorsa nella posizione che è stata restituita al client.
Ora è qui che comincio a vedere le cose un po 'diverse dalla risposta sopra.
Se il servizio non riesce a completare la richiesta, dovrebbe comunque creare una risorsa nella posizione che è stata restituita al client. Questa risorsa dovrebbe indicare il motivo dell'errore. È molto più flessibile avere una risorsa che fornisca informazioni di errore piuttosto che provare a inserirla nel protocollo HTTP.
Se il servizio riceve la richiesta di questa risorsa prima che sia completata, deve restituire "404 non trovato". Il motivo per cui credo che dovrebbe essere un "404 non trovato" è perché in realtà non esiste. Le specifiche HTTP non dicono che "404 Not Found" può essere usato solo per quando una risorsa non esisterà mai, solo che ora non esiste. Secondo me, questo tipo di risposta a un flusso di polling asincrono è completamente corretto.
C'è anche lo scenario di quando una risorsa dovrebbe essere lì solo per un tempo fisso. Ad esempio, potrebbe trattarsi di dati basati su una fonte che viene aggiornata ogni notte. Ciò che dovrebbe accadere in questi casi è che la risorsa debba essere rimossa, ma al servizio dovrebbe essere fornito un indicatore che possa sapere per restituire un codice di stato "410 Gone". Questo fondamentalmente sta dicendo al cliente che la risorsa era qui, ma non è più disponibile (es: potrebbe essere scaduta). L'azione tipica da parte del cliente sarebbe quella di inviare nuovamente la richiesta.
Dal punto di vista del cliente di nuovo
Quando il client ottiene la risposta per esso è POST iniziale, si ottiene il "Location" e fa la richiesta al servizio utilizzando l'URL utilizzando un GET (di nuovo, non POST). Il servizio risponderà generalmente con questi valori:
- "200 OK" indica che la richiesta è stata completata. Il risultato della richiesta viene restituito nel corpo del contenuto, fornendo il contenuto nel formato definito dall'intestazione Accetta HTTP.
- "404 Not Found" indica al client che la richiesta non è stata ancora completata, la risorsa non è ancora disponibile e, in questo caso, dovrebbe riprovare in un secondo momento.
- "410 Gone" verrebbe restituito nei casi in cui il client possa tentare di ottenere la risorsa dopo un lungo periodo di tempo e non ci sia più. In questo caso, è sufficiente inviare nuovamente la query originale
L'unica cosa che deve essere sottolineata è che la risorsa che viene restituita è generalmente in un formato che può definire le risposte di successo e di errore. Il client dovrebbe essere in grado di determinare da questa risorsa se c'è stato un errore, di cosa si trattava ed essere in grado di rispondere di conseguenza.
Inoltre, lo sviluppatore del servizio può farlo in modo che il servizio scada e cancelli la risorsa di errore dopo un breve periodo di tempo.
Quindi questa è la mia opinione su questa domanda. È molto tardi per la festa, ma spero che i futuri lettori possano vedere una visione leggermente diversa rispetto a una domanda comune.
Ti aspetti browser per utilizzare questo direttamente? Perché questa soluzione sembra soddisfacente per un'API (vedi la risposta di @systempuntoout), ma ovviamente non funzionerà per un browser web. –
Ho intenzione di provare e limitare i browser alle operazioni GET con le query più probabili conservate in memoria (ad esempio memcached). Eventuali query a più lungo termine verranno probabilmente eseguite tramite AJAX utilizzando il polling con un indicatore di avanzamento visualizzato (ad esempio il filtro di set di risultati di grandi dimensioni). PUT e POST saranno probabilmente simili al caricamento di video di youtube dove fornisco all'utente un messaggio standard "il tuo media è in elaborazione" finché il server non ha completato l'attività. –
Alcune risorse per restapi http://stackoverflow.com/questions/14124056/rest-api-202-versus-204/27766943#27766943 –