Eu estava pensando sobre isso.
Suponha que eu tenha um user
recurso com id
e name
campos. Se eu quiser atualizar um campo, poderia fazer uma solicitação PATCH para o recurso como este
PATCH /users/42
{"name": "john doe"}
E então o aplicativo atualizará o nome do usuário 42.
Mas por que, se eu repetir essa solicitação, o resultado seria diferente?
De acordo com a RFC 5789
PATCH não é seguro nem idempotente
rest
api-design
http
web-api
mattecapu
fonte
fonte
{"name": "bendjamin franklin"}
Respostas:
Uma solicitação PATCH pode ser idempotente, mas não é necessária. Essa é a razão pela qual é caracterizada como não-idempotente.
Se PATCH pode ser idempotente ou não depende muito de como as alterações necessárias são comunicadas.
Por exemplo, se o formato do patch estiver na forma de
{change: 'Name' from: 'benjamin franklin' to: 'john doe'}
, qualquer solicitação PATCH após a primeira terá um efeito diferente (uma resposta de falha) que a primeira solicitação.Outro motivo para a não idempotência pode ser que a aplicação da modificação em algo que não seja o recurso original pode tornar o recurso inválido. Esse também seria o caso se você aplicar a alteração várias vezes.
fonte
<name>
elemento. Se o PATCH adicionar um<name>
elemento a um recurso que originalmente não continha um, aplicar o PATCH duas vezes (ou aplicá-lo a um recurso que já contenha a<name>
) torna o recurso inválido, porque subitamente conteria dois<name>
elementos que não são permitidos para esses recursos.Penso que uma resposta clara quando PATCH não é idempotente é este parágrafo da RFC 5789:
Como o RFC especifica que o patch contém algumas "alterações gerais" no recurso, devemos olhar além da substituição típica de campo. Se o recurso é para um contador, o patch pode solicitar seu incremento, o que claramente não é idempotet.
fonte
PATCH
Os pedidos descrevem um conjunto de operações a serem aplicadas a um recurso. Se você aplicar o mesmo conjunto de operações duas vezes ao mesmo recurso, o resultado poderá não ser o mesmo. Isso ocorre porque a definição das operações depende de você. Em outras palavras, você precisa definir as regras de mesclagem .Lembre-se de que uma
PATCH
solicitação pode ser usada para corrigir recursos em vários formatos diferentes, não apenas no JSON.Portanto, uma
PATCH
solicitação pode ser idempotente se você definir as regras de mesclagem como idempotentes .Exemplo idêntico:
Exemplo não idempotente:
No segundo exemplo, usei uma sintaxe "tipo Mongo" que inventei para incrementar um atributo. Claramente, isso não é idempotente, pois o envio da mesma solicitação várias vezes resultaria em resultados diferentes a cada vez.
Agora você pode estar se perguntando se o uso de uma sintaxe inventada é válida. De acordo com os padrões , é:
E você também pode estar se perguntando se é tranqüilo usar
PATCH
solicitações dessa maneira e, como muitas pessoas consideram que não são, aqui está uma boa resposta com muitos comentários sobre o problema.fonte