Idempotent

Um método HTTP é idempotente se, e só se, o mesmo pedido puder ser feito mais do que uma vez, tendo sempre o mesmo resultado e deixando o servidor no mesmo estado. Por outras palavras, um método idempotente não deve ter efeitos secundários. Implementados corretamente, os métodos GET, HEAD, PUT, and DELETE são idempotentes, mas não o método POST. Todos os métodos safe também são idempotentes.

Para ser idempotente, apenas o "back-end" do servidor é considerado, sendo que o estado retornado por cada pedido pode diferir: a primeira chamada de DELETE deve retornar 200, enquanto as sucessivas devem retornar 404. Outra implicação de o DELETE ser idempotente é que os programadores não devem implementar APIs RESTful com a funcionalidade de apagar última entrada usando o método de DELETE.

É de notar que a idempotência de um método não é garantida pelo servidor e algumas aplicações podem incorretamente violar a constrição de idempotência.

GET /pageX HTTP/1.1 é idempotente. Com várias chamadas ao servidor, o cliente obtém os mesmos resultados:

GET /pageX HTTP/1.1   
GET /pageX HTTP/1.1   
GET /pageX HTTP/1.1   
GET /pageX HTTP/1.1   

POST /add_row HTTP/1.1 não é idempotente; com várias chamadas ao servidor, adiciona novas linhas:

POST /add_row HTTP/1.1
POST /add_row HTTP/1.1   -> Adiciona uma 2ª linha
POST /add_row HTTP/1.1   -> Adiciona uma 3ª linha

DELETE /idX/delete HTTP/1.1 é idempotente, mesmo que o estado de retorno seja diferente entre cada chamada:

DELETE /idX/delete HTTP/1.1   -> Returns 200 se idX existir
DELETE /idX/delete HTTP/1.1   -> Returns 404 visto que idX acabou de ser apagado
DELETE /idX/delete HTTP/1.1   -> Returns 404

Saber mais

Conhecimento comum

  • Definição de "idempotent" na especificação de HTTP.

Conhecimento técnico