As pessoas que desenhavam o HTTP / 2 eram muito mais detalhadas sobre suas idéias sobre o que o HTTP deveria fazer, mantendo o antigo significado. Vamos ver o que a versão preliminar do HTTP / 2 tem a dizer sobre a idempotência:
4.2.2 Métodos Idempotentes
Um método de solicitação é considerado "idempotente" se o efeito pretendido no servidor de várias solicitações idênticas com esse método for o mesmo que o efeito de uma única solicitação. Dos métodos de solicitação definidos por esta especificação, PUT, DELETE e solicitação segura métodos são idempotentes.
Como a definição de seguro, a propriedade idempotent se aplica apenas ao que foi solicitado pelo usuário; um servidor é livre para registrar cada solicitação separadamente, manter um histórico de controle de revisão ou implementar outros efeitos colaterais não idempotentes para cada solicitação idempotente .
O efeito pretendido no servidor para cada solicitação PUT é atualizar o recurso identificado por esse URI . É exatamente o que acontece no seu caso.
O fato de você decidir versão dos recursos não importa aqui. Se você não deseja criar uma nova versão quando nada foi alterado, precisará comparar a carga útil na solicitação PUT com a versão mais recente (ou identificada de outra forma) do recurso e quando nenhuma das propriedades foi alterada você pode optar por não criar uma nova versão .
Sua edição:
O histórico ficará visível para o usuário, pois várias chamadas resultariam em várias versões
No que diz respeito ao recurso, isso não é efeito colateral . O recurso nesse URI não muda (as mesmas propriedades são PUT). O histórico é apenas metadado, pois provavelmente é solicitado por um URI diferente ou com cabeçalhos de solicitação diferentes.
time
propriedade é atualizada? Eu acho que também são metadados, mesmo que estejam no recurso.O HTTP distingue entre duas propriedades:
Idempotência é definida pelas especificações da seguinte maneira:
E segurança:
Observe que a segurança implica idempotência: se um método não tiver efeitos colaterais, sua execução múltipla resultará no mesmo efeito colateral que uma vez, a saber nenhum.
Isso coloca os métodos em três categorias:
GET
,HEAD
,OPTION
,TRACE
PUT
,DELETE
POST
Isso esta errado.
PUT
é idempotente, mas não seguro. O ponto inteiro dePUT
é ter um efeito colateral, ou seja, atualizar um recurso. O que a idempotência significa é que atualizar o mesmo recurso com o mesmo conteúdo várias vezes deve ter o mesmo efeito que atualizá-lo apenas uma vez.Observe o último parágrafo da seção sobre segurança [ênfase minha]:
Embora essa sentença fale sobre
GET
segurança, podemos assumir que os autores também pretendiam aplicar o mesmo raciocínioPUT
e idempotência. IOW:PUT
deve ter apenas um efeito colateral visível ao usuário , ou seja, atualizar o recurso nomeado. Ele pode ter outros efeitos colaterais, mas o usuário não pode ser responsabilizado por eles.Por exemplo, o fato de
PUT
ser idempotente significa que posso tentar novamente quantas vezes quiser: a especificação garante que executá-lo várias vezes será exatamente o mesmo que executá-lo uma vez. É perfeitamente válido criar um acúmulo de revisões antigas como efeito colateral dessas váriasPUT
solicitações. No entanto, se, como resultado de várias tentativas, seu banco de dados for preenchido com uma lista de pendências de revisões antigas, isso não é problema meu, é seu.IOW: você pode ter quantos efeitos colaterais quiser, mas
fonte
Você está certo de que o PUT não precisa ter efeitos colaterais , no entanto, gostaria de acrescentar algo a isso.
Você está atualizando um
person
recurso identificado comoF02E395A235
, portanto, usar PUT está correto. Agora, como regra comercial, você também acompanha as alterações que são invisíveis para a entidade que chama (consumidor do serviço REST). Isso não adicionará um novo item noperson
recurso. O instantâneo histórico não estará acessível usando o/person/
terminal. Então, acredito que o PUT deve ser perfeitamente aceitável neste caso.fonte