Las personas que redactaron HTTP / 2 fueron mucho más detalladas sobre sus ideas de lo que HTTP debería hacer, mientras conservaban el significado anterior. Veamos qué dice el borrador HTTP / 2 sobre la idempotencia:
4.2.2 Métodos idempotentes
Un método de solicitud se considera "idempotente" si el efecto deseado en el servidor de múltiples solicitudes idénticas con ese método es el mismo que el efecto de una sola solicitud de este tipo. De los métodos de solicitud definidos por esta especificación, PUT, DELETE y solicitud segura Los métodos son idempotentes.
Al igual que la definición de caja fuerte, la propiedad idempotente solo se aplica a lo que ha solicitado el usuario; un servidor es libre de registrar cada solicitud por separado, retener un historial de control de revisión o implementar otros efectos secundarios no idempotentes para cada solicitud idempotente .
El efecto previsto en el servidor para cada solicitud PUT de este tipo es actualizar el recurso identificado por ese URI . Esto es exactamente lo que sucede en su caso.
Que decidas versionar recursos realmente no importa aquí. Si no desea crear una nueva versión cuando nada ha cambiado, deberá comparar la carga útil en la solicitud PUT con la versión más reciente (o identificada) del recurso, y cuando ninguna de las propiedades ha cambiado puedes elegir no crear una nueva versión .
Tu edición:
El historial será visible para el usuario, llamar varias veces daría como resultado múltiples versiones
En lo que respecta al recurso, eso no es un efecto secundario . El recurso en ese URI no cambia (las mismas propiedades obtienen PUT). El historial es solo metadatos, ya que probablemente lo solicite un URI diferente o con diferentes encabezados de solicitud.
time
propiedad se actualiza? Creo que también son metadatos, aunque estén en el recurso.HTTP distingue entre dos propiedades:
La idempotencia se define por la especificación de la siguiente manera:
Y seguridad:
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:
GET
,HEAD
,OPTION
,TRACE
PUT
,DELETE
POST
Eso está mal.
PUT
es idempotente pero no seguro. El punto entero dePUT
es 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]:
Aunque esta oración habla de
GET
seguridad, podemos suponer que los autores también tenían la intención de aplicar el mismo razonamientoPUT
e idempotencia. IOW:PUT
debe 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
PUT
sea 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 esasPUT
solicitudes 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
fuente
Tienes razón en que PUT no debe tener efectos secundarios , sin embargo, agregaría algo a esto.
Está actualizando un
person
recurso que se identifica comoF02E395A235
, por lo que usar PUT es correcto. Ahora, como regla comercial, también realiza un seguimiento de los cambios que son invisibles para la entidad que realiza la llamada (consumidor del servicio REST). Esto no agregará un nuevo elemento en elperson
recurso. La instantánea histórica no será accesible utilizando el/person/
punto final. Así que creo, PUT debería ser perfectamente aceptable en este caso.fuente