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, PUTe DELETEcompartilhar essa propriedade. Além disso, os métodos OPTIONSe 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 GETe 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.HEADPOSTPUTDELETE
Naturalmente, não é possível garantir que o servidor não gere efeitos colaterais como resultado da execução de uma GETsolicitaçã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 GETsolicitaçã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 GETsegurança, podemos assumir que os autores também pretendiam aplicar o mesmo raciocínio PUTe idempotência. IOW: PUTdeve 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 PUTser 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 PUTsolicitaçõ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