O HTTP distingue entre duas propriedades:
Idempotência é definida pelas especificações da seguinte maneira:
Os métodos também podem ter a propriedade " idempotência ", pois (além de problemas de erro ou expiração) os efeitos colaterais de N> 0 pedidos idênticos são os mesmos que para um único pedido. Os métodos GET
, HEAD
, PUT
e DELETE
compartilhar essa propriedade. Além disso, os métodos OPTIONS
e TRACE
não devem ter efeitos colaterais, e por isso são inerentemente idempotentes.
E segurança:
Em particular, foi estabelecida a convenção de que os métodos GET
e NÃO DEVEM ter o significado de tomar uma ação diferente da recuperação. Esses métodos devem ser considerados " seguros ". Isso permite que os agentes do usuário representem outros métodos, como , e , de uma maneira especial, para que o usuário seja informado do fato de que uma ação possivelmente insegura está sendo solicitada.HEAD
POST
PUT
DELETE
Naturalmente, não é possível garantir que o servidor não gere efeitos colaterais como resultado da execução de uma GET
solicitação; de fato, alguns recursos dinâmicos consideram isso um recurso. A distinção importante aqui é que o usuário não solicitou os efeitos colaterais, portanto, não pode ser responsabilizado por eles.
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:
- seguro (e, portanto, também idempotent):
GET
, HEAD
, OPTION
,TRACE
- idempotentes mas não necessariamente seguro:
PUT
,DELETE
- nem idempotente nem seguro:
POST
O PUT não precisa ter efeitos colaterais.
Isso esta errado. PUT
é idempotente, mas não seguro. O ponto inteiro de PUT
é 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]:
Naturalmente, não é possível garantir que o servidor não gere efeitos colaterais como resultado da execução de uma GET
solicitação; de fato, alguns recursos dinâmicos consideram isso um recurso. A distinção importante aqui é que o usuário não solicitou os efeitos colaterais, portanto, não pode ser responsabilizado por eles .
Embora essa sentença fale sobre GET
segurança, podemos assumir que os autores também pretendiam aplicar o mesmo raciocínio PUT
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árias PUT
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
- deve olhar para o usuário como se seus pedidos fossem idempotentes
- você é responsável por esses efeitos colaterais, não o usuário