Quais métodos HTTP correspondem a quais métodos CRUD?

213

Na programação de estilo RESTful, devemos usar métodos HTTP como nossos blocos de construção. Estou um pouco confuso sobre quais métodos correspondem aos métodos CRUD clássicos. GET / Read e DELETE / Delete são óbvios o suficiente.

No entanto, qual é a diferença entre PUT / POST? Eles combinam um a um com Criar e Atualizar?

Desenhou
fonte

Respostas:

298
Create = PUT with a new URI
         POST to a base URI returning a newly created URI
Read   = GET
Update = PUT with an existing URI
Delete = DELETE

O PUT pode mapear para Criar e Atualizar, dependendo da existência do URI usado com o PUT.

O POST mapeia para criar.

Correção: O POST também pode mapear para Atualização, embora seja normalmente usado para Criar. O POST também pode ser uma atualização parcial, portanto não precisamos do método PATCH proposto.

Paul Morgan
fonte
16
+1: A distinção que você faz entre PUT para criar recursos cujos nomes (URIs) são atribuídos pelo cliente e POST para criar recursos cujos nomes são atribuídos pelo servidor é importante. Consulte Richardson e Ruby Restful Web Services (O'Reilly) para uma discussão sobre ele.
Jim Ferrans
9
E como PUT e DELETE ainda não são suportados por navegadores da Web, é considerado "sobrecarregado POST" adicionando um argumento de string de consulta como method = PUT ou method = DELETE no URI que está sendo postado.
Jim Ferrans
2
Nice analisa jcalcote.wordpress.com/2008/10/16/…
Boris Ivanov
13
@JimFerrans PUT e DELETE são compatíveis com navegadores da Web, com o XHR. No entanto, no contexto de formulários HTML, a especificação HTML não os suporta, portanto os navegadores também não.
eis
3
Embora não seja mapeado canonicamente para uma carta no CRUD, muitas estruturas REST também usam GET / entity / para listar entidades do tipo entidade . GET / entity / id lerá a entidade específica que corresponde ao id .
Toddius Zho
49

A chave toda é se você está fazendo uma alteração idempotente ou não. Ou seja, se executar uma ação duas vezes na mensagem resultará na mesma coisa, como se tivesse sido feita apenas uma vez, você terá uma alteração idempotente e ela deverá ser mapeada para PUT. Caso contrário, ele mapeia para o POST. Se você nunca permitir que o cliente sintetize URLs, o PUT estará bem próximo do Update e o POST poderá lidar com o Create muito bem, mas essa certamente não é a única maneira de fazê-lo; se o cliente sabe que deseja criar /foo/abce sabe qual conteúdo colocar lá, ele funciona muito bem como um PUT.

A descrição canônica de um POST é quando você está comprando algo: essa é uma ação que ninguém quer repetir sem saber. Por outro lado, definir o endereço de envio para o pedido com antecedência pode ser feito com PUT: não importa se você é solicitado a enviar 6 Anywhere Dr, Nowherevilleuma vez, duas ou cem vezes: ainda é o mesmo endereço. Isso significa que é uma atualização? Pode ser ... Tudo depende de como você deseja escrever o back-end. (Observe que os resultados podem não ser idênticos: você pode informar o usuário quando ele fez uma PUT pela última vez como parte da representação do recurso, o que garantiria que PUTs repetidas não causassem um resultado idêntico, mas o resultado ainda seria seja "o mesmo" em um sentido funcional.)

Donal Fellows
fonte
1
Essa distinção entre os casos de uso para POSTe PUTé interessante e deve responder a "O que é 'create' e qual é 'update'?" muito mais claro. Além disso, com relação à implementação da API, conclui-se que um repetitivo PUTdeve equivaler a uma operação silenciosa, enquanto um repetitivo POSTpode gerar uma exceção se algum aspecto dos dados enviados permanecer único no armazenamento de dados que apóia o aplicativo.
Zerobandwidth 17/08/2015
2
Esta resposta & seguinte comentário aumento um ponto importante, que o cuidado deve ser exercido em equacionar CRUD para de perto semântica (1to1) com HTTP REST. Este não é um mapeamento canônico.
Martin Spamer 02/02
35

Eu estava procurando a mesma resposta, eis o que a IBM diz. IBM Link

POST            Creates a new resource.
GET             Retrieves a resource.
PUT             Updates an existing resource.
DELETE          Deletes a resource.
ex0b1t
fonte
10

No momento (2016), os verbos HTTP mais recentes são GET, POST, PATCH , PUT e DELETE

Visão geral

  • HTTP GET - SELECT / Solicitação
  • HTTP PUT - UPDATE
  • HTTP POST - INSERIR / Criar
  • PATCH HTTP - Quando PUT ting, uma representação completa de recursos é complicada e utiliza mais largura de banda, por exemplo: quando você precisa atualizar parcialmente uma coluna
  • HTTP DELETE - DELETE

Espero que isto ajude!

Se você estiver interessado em projetar APIs REST, é uma leitura ansewome! site versão online repositório github

d1jhoni1b
fonte
1
Desde fevereiro de 18, esteja ciente de que PATCH não está completamente implementado nas bibliotecas de clientes e servidores.
Dizzley
oh ok obrigado entendo ... você se importaria de postar um link / referência para que eu possa dar uma olhada, por favor?
D1jhoni1b
9

Há uma ótima conversa em vídeo do youtube por stormpath, na verdade explica isso, o URL deve pular para a parte correta do vídeo:

stormpath youtube video

Também vale a pena assistir, são mais de uma hora de conversa, mas muito interessantes se você pensa em investir tempo na construção de uma API REST.

pleshy
fonte
7

Depende da situação concreta .. mas em geral:

PUT = atualizar ou alterar um recurso concreto com um URI concreto do recurso.

POST = crie um novo recurso na origem do URI fornecido.

Ou seja,

Edite uma postagem no blog:

PUT: / blog / entrada / 1

Crie um novo:

POST: / blog / entrada

PUT pode criar um novo recurso em algumas circunstâncias em que o URI do novo recurso é limpo antes da solicitação. O POST também pode ser usado para implementar vários outros casos de uso, que não são cobertos por outros (GET, PUT, DELETE, HEAD, OPTIONS)

O entendimento geral dos sistemas CRUD é GET = request, POST = create, Put = update, DELETE = delete

Preso
fonte
4

Os blocos de construção do REST são principalmente os recursos (e URI) e a hipermídia. Nesse contexto, GETé a maneira de obter uma representação do recurso (que pode realmente ser mapeado para umSELECT em termos de CRUD).

No entanto, você não deve necessariamente esperar um mapeamento individual entre operações CRUD e verbos HTTP. A principal diferença entre PUTe POSTé sobre sua propriedade idempotente. POSTtambém é mais comumente usado para atualizações parciais, comoPUT geralmente implica o envio de uma nova representação completa do recurso.

Eu sugiro ler isso:

A especificação HTTP também é uma referência útil:

O método PUT solicita que a entidade fechada seja armazenada no URI de solicitação fornecido.

[...]

A diferença fundamental entre as solicitações POST e PUT é refletida no significado diferente do Request-URI. O URI em uma solicitação POST identifica o recurso que manipulará a entidade fechada. Esse recurso pode ser um processo de aceitação de dados, um gateway para outro protocolo ou uma entidade separada que aceita anotações. Por outro lado, o URI em uma solicitação PUT identifica a entidade incluída na solicitação - o agente do usuário sabe qual URI se destina e o servidor NÃO DEVE tentar aplicar a solicitação a algum outro recurso. Se o servidor desejar que a solicitação seja aplicada a um URI diferente,

Bruno
fonte
3

De um modo geral, este é o padrão que eu uso:

  • HTTP GET - SELECT / Solicitação
  • HTTP PUT - UPDATE
  • HTTP POST - INSERIR / Criar
  • HTTP DELETE - DELETE
AJ.
fonte
5
PUT e POST não correspondem exatamente a Atualizar ou Criar; PUT é "definido" (ou seja, onde você conhece o nome do recurso de antemão e está dando o valor a ser usado) e POST é tudo o mais. A chave é pensar se o que você está fazendo é idempotente ou não.
Donal Fellows
1
+1 no comentário. A suposição de um mapeamento absoluto entre os dois pode ser enganosa. Uma operação HTTP DELETE para algum URI, por exemplo, pode simplesmente modificar (por exemplo, UPDATE) um registro do lado do servidor, para que uma operação HTTP GET não retorne mais uma representação.
se
4
PUT e POST não correspondem exatamente a Atualizar ou Criar . É verdade, mas AJ descreveu qual padrão ele usa.
Piotr Dobrogost 28/09/11
1

O projeto Symfony tenta manter seus métodos HTTP unidos aos métodos CRUD, e sua lista os associa da seguinte forma:

  • GET Recupere o recurso do servidor
  • POST Crie um recurso no servidor
  • PUT Atualize o recurso no servidor
  • DELETE Exclua o recurso do servidor

Vale a pena notar que, como eles dizem nessa página, "Na realidade, muitos navegadores modernos não suportam os métodos PUT e DELETE".

Pelo que me lembro, o Symfony "falsifica" PUT e DELETE para os navegadores que não os suportam ao gerar seus formulários, a fim de tentar estar o mais próximo possível de usar o método HTTP teoricamente correto, mesmo quando um navegador não suporta isto.

Matt Gibson
fonte