HTTP distingue tra due proprietà:
L'idempotenza è definita dalla specifica come segue:
Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request. The methods GET
, HEAD
, PUT
and DELETE
share this property. Also, the methods OPTIONS
and TRACE
SHOULD NOT have side effects, and so are inherently idempotent.
E sicurezza:
In particular, the convention has been established that the GET
and HEAD
methods SHOULD NOT have the significance of taking an action other than retrieval. These methods ought to be considered "safe". This allows user agents to represent other methods, such as POST
, PUT
and DELETE
, in a special way, so that the user is made aware of the fact that a possibly unsafe action is being requested.
Naturally, it is not possible to ensure that the server does not generate side-effects as a result of performing a GET
request; in fact, some dynamic resources consider that a feature. The important distinction here is that the user did not request the side-effects, so therefore cannot be held accountable for them.
Si noti che la sicurezza implica l'idempotenza: se un metodo non ha effetti collaterali, eseguirlo più volte produrrà lo stesso effetto collaterale di una volta, vale a dire nessuno.
Questo pone i metodi in tre categorie:
- sicuro (e quindi anche idempotente):
GET
, HEAD
, OPTION
, TRACE
- idempotente ma non necessariamente sicuro:
PUT
, DELETE
- né idempotente né sicuro:
POST
PUT needs to have no side affects.
Questo è sbagliato. PUT
è idempotente ma non sicuro. Il punto intero di PUT
ha un effetto collaterale, ovvero l'aggiornamento di una risorsa. Ciò che significa idempotenza è che l'aggiornamento della stessa risorsa con gli stessi contenuti più volte dovrebbe avere lo stesso effetto dell'aggiornamento solo una volta.
Nota l'ultimo paragrafo nella sezione sulla sicurezza [enfasi sul mio]:
Naturally, it is not possible to ensure that the server does not generate side-effects as a result of performing a GET
request; in fact, some dynamic resources consider that a feature. The important distinction here is that the user did not request the side-effects, so therefore cannot be held accountable for them.
Sebbene questa frase parli di GET
e sicurezza, possiamo presumere che gli autori intendessero anche applicare lo stesso ragionamento a PUT
e idempotency. IOW: PUT
dovrebbe avere solo un effetto collaterale visibile all'utente , ovvero l'aggiornamento della risorsa denominata. potrebbe avere altri effetti collaterali, ma l'utente non può essere ritenuto responsabile per loro.
Ad esempio, il fatto che PUT
sia idempotente significa che posso riprovare tutte le volte che voglio: la specifica garantisce che eseguirla più volte sarà esattamente la stessa cosa che eseguirla una volta . È perfettamente valido creare un backlog di vecchie revisioni come un effetto collaterale di quelle richieste multiple PUT
. Tuttavia, se, come risultato di più tentativi, il tuo database si riempie con un arretrato di vecchie revisioni, non è un mio problema, è tuo.
IOW: ti è permesso avere tanti effetti collaterali quanti vuoi, ma
- deve guardare all'utente come se le sue richieste fossero idempotenti
- sei responsabile di quegli effetti collaterali, non dell'utente