HTTP distingue tra due proprietà:
L'idempotenza è definita dalla specifica come segue:
I metodi possono anche avere la proprietà di " idempotenza " in quanto (a parte errori o problemi di scadenza) gli effetti collaterali di richieste identiche N> 0 sono le stesse di una singola richiesta. I metodi GET
, HEAD
, PUT
e DELETE
condividono questa proprietà. Inoltre, i metodi OPTIONS
e TRACE
NON DOVREBBERO avere effetti collaterali, e quindi sono intrinsecamente idempotenti.
E sicurezza:
In particolare, è stata stabilita la convenzione che i metodi GET
e NON DOVREBBERO avere il significato di intraprendere un'azione diversa dal recupero. Questi metodi dovrebbero essere considerati " sicuri ". Ciò consente agli interpreti utenti di rappresentare altri metodi, come , e , in modo speciale, in modo che l'utente venga a conoscenza del fatto che viene richiesta un'azione potenzialmente non sicura.HEAD
POST
PUT
DELETE
Naturalmente, non è possibile garantire che il server non generi effetti collaterali a seguito dell'esecuzione di una GET
richiesta; in effetti, alcune risorse dinamiche ritengono che una caratteristica. La distinzione importante qui è che l'utente non ha richiesto gli effetti collaterali, quindi non può essere ritenuto responsabile per loro.
Si noti che la sicurezza implica idempotenza: se un metodo non ha effetti collaterali, eseguirlo più volte produrrà lo stesso effetto collaterale di eseguirlo una volta, vale a dire nessuno.
Questo mette i metodi in tre categorie:
- cassetta di sicurezza (e quindi anche idempotente):
GET
, HEAD
, OPTION
,TRACE
- idempotente ma non necessariamente al sicuro:
PUT
,DELETE
- né idempotente né sicuro:
POST
Il PUT non deve avere effetti collaterali.
Questo è sbagliato. PUT
è idempotente ma non sicuro. L' intero punto di PUT
è di avere un effetto collaterale, cioè l'aggiornamento di una risorsa. Ciò che significa idempotenza è che l'aggiornamento della stessa risorsa con lo stesso contenuto più volte dovrebbe avere lo stesso effetto dell'aggiornamento solo una volta.
Nota l'ultimo paragrafo nella sezione sulla sicurezza [enfasi mia]:
Naturalmente, non è possibile garantire che il server non generi effetti collaterali a seguito dell'esecuzione di una GET
richiesta; in effetti, alcune risorse dinamiche ritengono che una caratteristica. La distinzione importante qui è che l'utente non ha richiesto gli effetti collaterali, quindi non può essere ritenuto responsabile per loro .
Sebbene questa frase parli di GET
e sicurezza, possiamo presumere che gli autori intendessero applicare anche lo stesso ragionamento PUT
e idempotenza. IOW: PUT
dovrebbe avere un solo effetto collaterale visibile dall'utente , vale a dire l'aggiornamento della risorsa denominata. Si può avere altri effetti collaterali, ma l'utente non può essere ritenuta 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 uguale a eseguirla una volta. È perfettamente valido creare un arretrato di vecchie revisioni come effetto collaterale di quelle PUT
richieste multiple . Tuttavia, se, a seguito di più tentativi, il database si riempie di un arretrato di vecchie revisioni, non è un mio problema, è tuo.
IOW: puoi avere tutti gli effetti collaterali che vuoi, ma
- deve guardare all'utente come se le sue richieste fossero idempotenti
- sei responsabile di quegli effetti collaterali, non dell'utente