HTTP distingue entre dos propiedades:
- Idempotencia
- La seguridad
La idempotencia se define por la especificación de la siguiente manera:
Los métodos también pueden tener la propiedad de " idempotencia " en que (aparte de los problemas de error o caducidad) los efectos secundarios de N> 0 solicitudes idénticas son las mismas que para una solicitud única. Los métodos GET, HEAD, PUTy DELETEcomparten esta propiedad. Además, los métodos OPTIONSy TRACE NO DEBEN tener efectos secundarios, por lo que son inherentemente idempotentes.
Y seguridad:
En particular, se ha establecido que la convención GETy los HEADmétodos NO DEBEN tener la importancia de tomar una acción que no sea la recuperación. Estos métodos deben considerarse " seguros ". Esto permite a los agentes de usuario representar otros métodos, como POST, PUTy DELETE, de manera especial, para que el usuario sea consciente del hecho de que se está solicitando una acción posiblemente insegura.
Naturalmente, no es posible garantizar que el servidor no genere efectos secundarios como resultado de realizar una GETsolicitud; de hecho, algunos recursos dinámicos lo consideran una característica. La distinción importante aquí es que el usuario no solicitó los efectos secundarios, por lo tanto, no puede ser considerado responsable de ellos.
Tenga en cuenta que la seguridad implica idempotencia: si un método no tiene efectos secundarios, realizarlo varias veces producirá el mismo efecto secundario que realizarlo una vez, es decir, ninguno.
Esto pone los métodos en tres categorías:
- caja de seguridad (y por tanto también idempotente):
GET, HEAD, OPTION,TRACE
- idempotente pero no necesariamente segura:
PUT,DELETE
- ni idempotente ni seguro:
POST
PUT no debe tener efectos secundarios.
Eso está mal. PUTes idempotente pero no seguro. El punto entero de PUTes tener un efecto secundario, es decir, la actualización de un recurso. Lo que significa idempotencia es que actualizar el mismo recurso con el mismo contenido varias veces debería tener el mismo efecto que actualizarlo solo una vez.
Tenga en cuenta el último párrafo en la sección sobre seguridad [énfasis mío]:
Naturalmente, no es posible garantizar que el servidor no genere efectos secundarios como resultado de realizar una GETsolicitud; de hecho, algunos recursos dinámicos lo consideran una característica. La distinción importante aquí es que el usuario no solicitó los efectos secundarios, por lo tanto, no puede ser considerado responsable de ellos .
Aunque esta oración habla de GETseguridad, podemos suponer que los autores también tenían la intención de aplicar el mismo razonamiento PUTe idempotencia. IOW: PUTdebe tener solo un efecto secundario visible para el usuario , es decir, actualizar el recurso nombrado. Se puede tener otros efectos secundarios, pero el usuario no puede ser considerado responsable de los mismos.
Por ejemplo, el hecho de que PUTsea idempotente significa que puedo volver a intentarlo tantas veces como quiera: la especificación garantiza que ejecutarlo varias veces será exactamente lo mismo que ejecutarlo una vez. Es perfectamente válido crear una acumulación de revisiones antiguas como efecto secundario de esas PUTsolicitudes múltiples . Sin embargo, si, como resultado de múltiples reintentos, su base de datos se llena con una acumulación de revisiones antiguas, ese no es mi problema, es suyo.
IOW: puedes tener tantos efectos secundarios como quieras, pero
- debe mirar al usuario como si sus solicitudes fueran idempotentes
- usted es responsable de esos efectos secundarios, no el usuario