2015-12-04 24 views
6

A le richieste possono avere molti risultati e mi chiedevo quale codice di stato sarebbe il migliore per ciascuna di esse.Codice di stato HTTP per PUT

dire che voglio creare un nuove risorse, in modo da fare qualcosa di simile:

PUT http://example.com/resources/resource-1 

e vorrei ottenere un HTTP 201 perché una nuova risorsa è stato creato.

Ora voglio aggiornare questa risorsa, così faccio la stessa richiesta, con nuovi contenuti:

PUT http://example.com/resources/resource-1 

e ottengo HTTP 200 o HTTP 204, perché la risorsa è stata aggiornata. Ma cosa succede se invio questa richiesta ancora una volta con lo stesso contenuto? Il server deve restituire HTTP 200 o HTTP 204 anche se non è stato aggiornato nulla?

Sono consapevole del fatto che HTTP 200 e HTTP 204 significano solo che la richiesta è stata elaborata correttamente e anche se i dati non cambiano la richiesta può (e dovrebbe) essere ancora elaborata correttamente. Ma c'è un modo per dire al cliente che la richiesta è stata elaborata correttamente ma nulla è cambiato sul lato server? E se c'è, dovrebbe essere usato per una richiesta PUT? PUT essendo idempotente, dovrebbe essere restituito uno stato diverso a seconda dell'elaborazione effettiva sul lato server (a condizione che non si verifichi alcun errore durante l'elaborazione)?

risposta

6

Ma c'è un modo per dire al client che la richiesta è stata elaborata correttamente ma nulla è cambiato sul lato server?

Sì, ma non è quello che sono i codici di stato.

O restituire 200 OK e una rappresentazione dell'entità o 204 Nessun contenuto e non restituire nulla.

Per nessuna modifica applicata, utilizzare un'intestazione come ETag. Il cliente può confrontare l'ETag con il loro valore precedente e determinare che nulla è stato cambiato.

+0

Non violerebbe idempotancy (richiesto per un PUT) se la risorsa ha restituito 201 la prima richiesta PUT, ma 200 o 204 nella richiesta successiva? – Ray

+1

@Ray no, perché l'idempotenza riguarda _il risultato sul server_, o più specificamente il contenuto in byte della risorsa identificata dall'URL della richiesta, non il contenuto del messaggio di risposta. Il risultato sul server non cambia sui PUT successivi della stessa risorsa. :) Vedi ad esempio: [_ "Si noti che mentre le operazioni idempotent producono lo stesso risultato sul server (senza effetti collaterali), la risposta stessa potrebbe non essere la stessa (ad esempio lo stato di una risorsa può cambiare tra le richieste)" _] (http : //www.restapitutorial.com/lessons/idempotency.html). – CodeCaster

+0

Ah ... grazie per il chiarimento - ha perfettamente senso. – Ray