De acordo com a especificação HTTP / 1.1:
O
POST
método é usado para solicitar que o servidor de origem aceite a entidade incluída na solicitação como um novo subordinado do recurso identificado peloRequest-URI
noRequest-Line
Em outras palavras, POST
é usado para criar .
O
PUT
método solicita que a entidade fechada seja armazenada sob o fornecidoRequest-URI
. Se oRequest-URI
refere-se a um recurso já existente, a entidade fechada deve ser considerada como uma versão modificada do que reside no servidor de origem. SeRequest-URI
não apontar para um recurso existente e esse URI puder ser definido como um novo recurso pelo agente solicitante, o servidor de origem poderá criar o recurso com esse URI. "
Ou seja, PUT
é usado para criar ou substituir .
Então, qual deles deve ser usado para criar um recurso? Ou é preciso apoiar os dois?
Respostas:
No geral:
PUT e POST podem ser usados para criar.
Você precisa perguntar "para o que você está executando a ação?" para distinguir o que você deve usar. Vamos supor que você esteja criando uma API para fazer perguntas. Se você deseja usar o POST, faça isso com uma lista de perguntas. Se você quiser usar o PUT, faça isso com uma pergunta específica.
Podem ser usados ótimos, portanto, qual deles devo usar no meu design RESTful:
Você não precisa oferecer suporte a PUT e POST.
O que é usado fica a seu critério. Mas lembre-se de usar o correto, dependendo do objeto que você está referenciando na solicitação.
Algumas considerações:
Um exemplo:
Escrevi o seguinte como parte de outra resposta no SO sobre isso :
Além disso, e de forma um pouco mais concisa, a Seção 4.3.4 da RFC 7231 PUT afirma (grifo nosso),
fonte
Você pode encontrar afirmações na web que dizem
Nenhum dos dois está certo.
Melhor é escolher entre PUT e POST com base na idempotência da ação.
PUT implica colocar um recurso - substituindo completamente o que estiver disponível no URL fornecido por algo diferente. Por definição, um PUT é idempotente. Faça quantas vezes quiser e o resultado será o mesmo.
x=5
é idempotente. Você pode COLOCAR um recurso se ele existe anteriormente ou não (por exemplo, para Criar ou Atualizar)!O POST atualiza um recurso, adiciona um recurso subsidiário ou causa uma alteração. Um POST não é idempotente, da maneira que
x++
não é idempotente.Por esse argumento, PUT é para criar quando você souber o URL da coisa que criará. O POST pode ser usado para criar quando você souber o URL da "fábrica" ou gerente da categoria de itens que deseja criar.
tão:
ou:
fonte
name
edate
. Se tivermos uma entidade com uma existentename
edate
, mas fizermos solicitações especificando apenas aname
, o comportamento adequado de PUT seria obliterar odate
da entidade, enquanto o POST pode atualizar apenas as propriedades especificadas, deixando as propriedades não especificadas como estavam. antes da solicitação ser feita. Isso parece correto / razoável ou é um uso inadequado do PUT (vi referências ao PATCH , que parece ser mais apropriado, mas ainda não existe)?A especificação relevante para PUT e POST é RFC 2616 §9.5ff.
O POST cria um recurso filho ; portanto, o POST
/items
cria recursos que residem no/items
recurso. Por exemplo./items/1
. Enviar o mesmo pacote de postagem duas vezes criará dois recursos.PUT é para criar ou substituir um recurso em uma URL conhecida pelo cliente .
Portanto: PUT é apenas um candidato para CREATE onde o cliente já conhece o URL antes que o recurso seja criado. Por exemplo.
/blogs/nigel/entry/when_to_use_post_vs_put
como o título é usado como a chave do recursoPUT substitui o recurso no URL conhecido, se ele já existir, portanto, enviar a mesma solicitação duas vezes não terá efeito. Em outras palavras, as chamadas para PUT são idempotentes .
O RFC é assim:
Nota: PUT tem sido usado principalmente para atualizar recursos (substituindo-os por inteiro), mas recentemente há um movimento no sentido de usar PATCH para atualizar recursos existentes, pois PUT especifica que ele substitui todo o recurso. RFC 5789.
Atualização 2018 : Existe um caso que pode ser feito para evitar o PUT. Consulte "REST sem PUT"
extraído do REST API Design - Modelagem de Recursos por Prakash Subramaniam do Thoughtworks
Isso força a API a evitar problemas de transição de estado com vários clientes que atualizam um único recurso e corresponde melhor à fonte de eventos e ao CQRS. Quando o trabalho é concluído de forma assíncrona, POST a transformação e aguardando sua aplicação parece apropriada.
fonte
Resumo:
Crio:
Pode ser realizado com PUT ou POST da seguinte maneira:
Atualizar:
Só pode ser executado com PUT da seguinte maneira:
Explicação:
Ao lidar com REST e URI como geral, você tem genérico à esquerda e específico à direita . Os genéricos geralmente são chamados de coleções e os itens mais específicos podem ser chamados de recurso . Observe que um recurso pode conter uma coleção .
Quando você usa o POST, está sempre se referindo a uma coleção ; portanto, sempre que você diz:
você está postando um novo usuário na coleção de usuários .
Se você continuar e tentar algo como isto:
ele vai trabalhar, mas semanticamente você está dizendo que você deseja adicionar um recurso para o john coleção sob a usuários coleção .
Depois de usar o PUT, você está se referindo a um recurso ou item único, possivelmente dentro de uma coleção . Então, quando você diz:
você está informando à atualização do servidor ou cria, se não existir, o recurso john na coleção de usuários .
Especificação:
Deixe-me destacar algumas partes importantes das especificações:
POSTAR
Portanto, cria um novo recurso em uma coleção .
COLOCAR
Portanto, crie ou atualize com base na existência do recurso .
Referência:
fonte
POST
significa "criar novo", como em "Aqui está a entrada para criar um usuário, crie para mim".PUT
significa "inserir, substituir se já existir", como em "Aqui estão os dados para o usuário 5".Você
POST
pode acessar example.com/users, como ainda não conheceURL
o usuário, deseja que o servidor o crie.Você
PUT
pode example.com/users/id desde que deseja substituir / criar um usuário específico .POSTAR duas vezes com os mesmos dados significa criar dois usuários idênticos com IDs diferentes. Colocar duas vezes com os mesmos dados cria o usuário primeiro e atualiza-o para o mesmo estado na segunda vez (sem alterações). Como você termina com o mesmo estado depois de
PUT
não importa quantas vezes você o executa, diz-se que é "igualmente potente" todas as vezes - idempotente. Isso é útil para tentar novamente solicitações automaticamente. Chega de 'você tem certeza de que deseja reenviar' ao pressionar o botão Voltar no navegador.Um conselho geral é usar
POST
quando você precisar que o servidor esteja no controle daURL
geração de seus recursos. Use dePUT
outra forma. PreferePUT
maisPOST
.fonte
user 5
se ele ainda não existir? Você não quer dizerupdate, replace if already exists
? ou algo assimPUT
também pode ser usado para substituir o valor de um recurso existente na sua totalidade.Eu gostaria de adicionar meu conselho "pragmático". Use PUT quando souber o "id" pelo qual o objeto que você está salvando pode ser recuperado. O uso de PUT não funcionará muito bem se você precisar, digamos, de um ID gerado pelo banco de dados a ser retornado para que você faça pesquisas ou atualizações futuras.
Portanto: para salvar um usuário existente ou aquele em que o cliente gera o ID e foi verificado que o ID é exclusivo:
Caso contrário, use POST para criar inicialmente o objeto e PUT para atualizar o objeto:
fonte
POST /users
. (Observe o/users
plural.) Isso tem o efeito de criar um novo usuário e torná-lo um recurso filho da/users
coleção.GET /users
faz sentido, ele lê como você deseja, mas eu ficaria bem comGET /user/<id>
ouPOST /user
(com carga útil para o novo usuário), porque ele lê corretamente 'me chame de usuário 5' é estranho, mas 'me chame de usuário 5' é mais natural. Eu provavelmente ainda cair no lado da pluralização embora :)Use POST para criar e PUT para atualizar. É assim que Ruby on Rails está fazendo isso, de qualquer maneira.
fonte
POST /items
adiciona um novo item a um recurso já definido ('item'). Como a resposta diz, não cria "um grupo". Eu não entendo por que isso tem 12 votos.PUT /items/42
também é válido para a criação de um recurso, mas apenas se o cliente tiver o privilégio de nomear o recurso . (O Rails permitir que um cliente este privilégio de nomenclatura?)Ambos são usados para transmissão de dados entre cliente e servidor, mas há diferenças sutis entre eles, que são:
Analogia:
Mídia Social / Analogia de Rede:
fonte
REST é um muito conceito de alto nível. De fato, nem sequer menciona HTTP!
Se você tiver alguma dúvida sobre como implementar o REST no HTTP, sempre poderá dar uma olhada na especificação do Atom Publication Protocol (AtomPub) . O AtomPub é um padrão para a criação de serviços da Web RESTful com HTTP, desenvolvido por muitos especialistas em HTTP e REST, com algumas informações de Roy Fielding, o inventor do REST e (co) inventor do próprio HTTP.
De fato, você pode até usar o AtomPub diretamente. Embora tenha saído da comunidade de blogs, não é de forma alguma restrito aos blogs: é um protocolo genérico para interagir RESTfully com coleções arbitrárias (aninhadas) de recursos arbitrários via HTTP. Se você puder representar seu aplicativo como uma coleção aninhada de recursos, poderá usar o AtomPub e não se preocupar em usar PUT ou POST, quais códigos de status HTTP retornar e todos esses detalhes.
Isto é o que AtomPub tem a dizer sobre criação de recursos (seção 9.2):
fonte
A decisão de usar PUT ou POST para criar um recurso em um servidor com uma API HTTP + REST é baseada em quem possui a estrutura de URL. Tendo o cliente conhecido ou participando da definição, a estrutura da URL é um acoplamento desnecessário semelhante aos acoplamentos indesejáveis que surgiram da SOA. Escapar de tipos de acoplamentos é o motivo pelo qual o REST é tão popular. Portanto, o método adequado a ser usado é o POST. Há exceções a essa regra e elas ocorrem quando o cliente deseja manter o controle sobre a estrutura de localização dos recursos que implanta. Isso é raro e provavelmente significa que algo mais está errado.
Neste ponto, algumas pessoas argumentam que, se URLs RESTful são usadas, o cliente conhece a URL do recurso e, portanto, uma PUT é aceitável. Afinal, é por isso que os URLs canônicos, normalizados, do Ruby on Rails e do Django são importantes, veja a API do Twitter ... blá blá blá. Essas pessoas precisam entender que não existe um URL repousante e que o próprio Roy Fielding afirma que :
A idéia de um URL RESTful é na verdade uma violação do REST, pois o servidor é responsável pela estrutura da URL e deve estar livre para decidir como usá-lo para evitar o acoplamento. Se isso confunde você lê sobre o significado da autodescoberta no design da API.
O uso do POST para criar recursos vem com uma consideração de design, porque o POST não é idempotente. Isso significa que repetir um POST várias vezes não garante o mesmo comportamento todas as vezes. Isso assusta as pessoas a usar o PUT para criar recursos quando não deveriam. Eles sabem que está errado (POST é para CREATE), mas o fazem de qualquer maneira porque não sabem como resolver esse problema. Essa preocupação é demonstrada na seguinte situação:
O passo 6 é onde as pessoas geralmente ficam confusas sobre o que fazer. No entanto, não há razão para criar um kludge para resolver esse problema. Em vez disso, o HTTP pode ser usado conforme especificado na RFC 2616 e o servidor responde:
Responder com um código de status 409 Conflict é o recurso correto porque :
Atualização baseada no lançamento do RFC 7231 para substituir 2616
O RFC 7231 foi projetado para substituir 2616 e na Seção 4.3.3 descreve a seguinte resposta possível para um POST
Agora pode ser tentador simplesmente retornar um 303 no caso de um POST ser repetido. No entanto, o oposto é verdadeiro. Retornar um 303 só faria sentido se várias solicitações de criação (criando recursos diferentes) retornassem o mesmo conteúdo. Um exemplo seria um "obrigado por enviar sua mensagem de solicitação" que o cliente não precisa baixar novamente a cada vez. A RFC 7231 ainda mantém na seção 4.2.2 que o POST não deve ser idempotente e continua mantendo que o POST deve ser usado para criação.
Para mais informações sobre isso, leia este artigo .
fonte
Eu gosto deste conselho, da definição de PUT da RFC 2616 :
Isso combina com os outros conselhos aqui, que PUT é melhor aplicado a recursos que já têm um nome e POST é bom para criar um novo objeto em um recurso existente (e deixar que o servidor o nomeie).
Eu interpreto isso e os requisitos de idempotência no PUT, para dizer que:
fonte
Em resumo:
PUT é idempotente, onde o estado do recurso será o mesmo se a mesma operação for executada uma vez ou várias vezes.
POST não é idempotente, onde o estado do recurso pode se tornar diferente se a operação for executada várias vezes em comparação com a execução de uma única vez.
Analogia com consulta ao banco de dados
PUT Você pode pensar em algo semelhante a "UPDATE STUDENT SET address =" abc "onde id =" 123 ";
POST Você pode pensar em algo como "INSERIR NO ALUNO (nome, endereço) VALORES (" abc "," xyzzz ");
O ID do aluno é gerado automaticamente.
Com PUT, se a mesma consulta for executada várias vezes ou uma vez, o estado da tabela STUDENT permanecerá o mesmo.
No caso do POST, se a mesma consulta for executada várias vezes, vários registros de Alunos serão criados no banco de dados e o estado do banco de dados será alterado a cada execução de uma consulta "INSERT".
NOTA: O PUT precisa de um local de recurso (já recurso) no qual a atualização precisa ocorrer, enquanto o POST não exige isso. Portanto, intuitivamente, o POST é destinado à criação de um novo recurso, enquanto o PUT é necessário para atualizar o recurso já existente.
Alguns podem sugerir que as atualizações possam ser realizadas com o POST. Não existe uma regra rígida qual usar para atualizações ou qual criar para criar. Novamente, essas são convenções e, intuitivamente, estou inclinado ao raciocínio acima mencionado e o sigo.
fonte
O POST é como postar uma carta em uma caixa de correio ou postar um email em uma fila de emails. PUT é como quando você coloca um objeto em um cubículo ou em um local em uma prateleira (ele tem um endereço conhecido).
Com o POST, você está postando no endereço da QUEUE ou COLLECTION. Com PUT, você está colocando no endereço do ITEM.
PUT é idempotente. Você pode enviar a solicitação 100 vezes e isso não importa. O POST não é idempotente. Se você enviar a solicitação 100 vezes, receberá 100 e-mails ou 100 cartas na sua caixa postal.
Uma regra geral: se você souber o ID ou nome do item, use PUT. Se você deseja que o ID ou nome do item seja atribuído pela parte receptora, use POST.
fonte
Nova resposta (agora que eu entendo melhor o REST):
PUT é apenas uma declaração de qual conteúdo o serviço deve, a partir de agora, usar para renderizar representações do recurso identificado pelo cliente; O POST é uma declaração de qual conteúdo o serviço deve, a partir de agora, conter (possivelmente duplicado), mas cabe ao servidor como identificar esse conteúdo.
PUT x
(sex
identifica um recurso ): "Substitua o conteúdo do recurso identificado porx
pelo meu conteúdo".PUT x
(sex
não identificar um recurso): "Crie um novo recurso contendo meu conteúdo e usex
para identificá-lo."POST x
: "Armazene meu conteúdo e me forneça um identificador que eu possa usar para identificar um recurso (antigo ou novo) que contém esse conteúdo (possivelmente misturado com outro conteúdo). O referido recurso deve ser idêntico ou subordinado ao que éx
identificado". " o recurso de y é subordinado ao recurso de x " é tipicamente, mas não necessariamente implementado, tornando y um subcaminho de x (por exemplo, x =/foo
e y =/foo/bar
) e modificando a (s) representação (ões) do de x recurso para refletir a existência de um novo recurso, por exemplo, com um hiperlink para yrecurso e alguns metadados. Somente o último é realmente essencial para um bom design, pois os URLs são opacos no REST - você deve usar a hipermídia em em vez da construção de URL do lado do cliente para atravessar o serviço de qualquer maneira.No REST, não existe um recurso que contenha "conteúdo". Refiro-me como "conteúdo" aos dados que o serviço usa para renderizar representações de forma consistente. Geralmente consiste em algumas linhas relacionadas em um banco de dados ou arquivo (por exemplo, um arquivo de imagem). Cabe ao serviço converter o conteúdo do usuário em algo que o serviço possa usar, por exemplo, converter uma carga JSON em instruções SQL.
Resposta original (pode ser mais fácil de ler) :
PUT /something
(se/something
já existir): "Pegue o que tiver em/something
e substitua pelo que eu lhe der."PUT /something
(se/something
ainda não existir): "Pegue o que eu lhe dou e coloque-o no/something
".POST /something
: "Pegue o que eu lhe der e coloque-o em qualquer lugar que desejar/something
, desde que você me dê o URL quando terminar."fonte
Resposta curta:
Regra simples: use o POST para criar, use PUT para atualizar.
Resposta longa:
POSTAR:
COLOCAR:
Resposta mais longa:
Para entendê-lo, precisamos questionar por que o PUT foi necessário, quais foram os problemas que o PUT estava tentando resolver que o POST não conseguiu.
Do ponto de vista da arquitetura REST, não há nada que importe. Poderíamos ter vivido sem o PUT também. Mas, do ponto de vista de um desenvolvedor de cliente, ele tornou sua vida muito mais simples.
Antes da PUT, os clientes não podiam saber diretamente a URL que o servidor gerou ou se tudo isso gerou alguma ou se os dados a serem enviados ao servidor já estão atualizados ou não. O PUT aliviou o desenvolvedor de todas essas dores de cabeça. PUT é idempotente, PUT lida com as condições da corrida e PUT permite que o cliente escolha o URL.
fonte
O Ruby on Rails 4.0 usará o método 'PATCH' em vez de PUT para fazer atualizações parciais.
A RFC 5789 diz sobre PATCH (desde 1995):
" Edge Rails: PATCH é o novo método HTTP primário para atualizações ", explica.
fonte
Correndo o risco de reafirmar o que já foi dito, parece importante lembrar que PUT implica que o cliente controla o que a URL acabará sendo ao criar um recurso. Portanto, parte da escolha entre PUT e POST será sobre o quanto você pode confiar no cliente para fornecer URL normalizada e correta, coerente com o esquema de URL.
Quando você não pode confiar totalmente no cliente para fazer a coisa certa, seria mais apropriado usar o POST para criar um novo item e, em seguida, enviar a URL de volta ao cliente na resposta.
fonte
Location
cabeçalho que não contêm o nome do recurso canônico.PUT /X-files/series/4/episodes/max
) e o servidor responder com um URI que fornece um link exclusivo canônico curto para esse novo recurso (ou seja/X-Ffiles/episodes/91
)De uma maneira muito simples, estou tomando o exemplo da linha do tempo do Facebook.
Caso 1: quando você publica algo em sua linha do tempo, é uma nova entrada. Portanto, nesse caso, eles usam o método POST porque o método POST é não-idempotente.
Caso 2: se seu amigo comentar sua postagem pela primeira vez, isso também criará uma nova entrada no banco de dados para que o método POST seja usado.
Caso 3: se o seu amigo editar o comentário dele, nesse caso, ele possui um ID de comentário, para atualizar um comentário existente em vez de criar uma nova entrada no banco de dados. Portanto, para esse tipo de operação, use o método PUT porque é idempotente. *
Em uma única linha, use o POST para adicionar uma nova entrada no banco de dados e PUT para atualizar algo no banco de dados.
fonte
A consideração mais importante é a confiabilidade . Se uma mensagem POST for perdida, o estado do sistema é indefinido. A recuperação automática é impossível. Para mensagens PUT, o estado é indefinido apenas até a primeira tentativa bem-sucedida.
Por exemplo, pode não ser uma boa ideia criar transações com cartão de crédito com o POST.
Se você tiver URIs gerados automaticamente em seu recurso, ainda poderá usar PUT passando um URI gerado (apontando para um recurso vazio) para o cliente.
Algumas outras considerações:
fonte
Os leitores novos deste tópico ficarão impressionados com a interminável discussão sobre o que você deve fazer e a relativa ausência de lições da experiência. O fato de o REST ser "preferido" em relação ao SOAP é, suponho, um aprendizado de alto nível com a experiência, mas, por Deus, devemos ter progredido a partir daí? É 2016. A dissertação de Roy foi em 2000. O que desenvolvemos? Foi divertido? Foi fácil integrar? Suportar? Ele suportará o surgimento de smartphones e conexões móveis esquisitas?
Segundo ME, as redes da vida real não são confiáveis. Solicita tempo limite. As conexões são redefinidas. As redes ficam inoperantes por horas ou dias por vez. Os trens entram em túneis com usuários móveis a bordo. Para qualquer solicitação (como ocasionalmente reconhecido em toda essa discussão), a solicitação pode cair na água a caminho ou a resposta pode cair na água no caminho de volta. Nessas condições, emitir solicitações PUT, POST e DELETE diretamente contra recursos substantivos sempre me pareceu um pouco brutal e ingênuo.
O HTTP não faz nada para garantir a conclusão confiável da solicitação-resposta, e isso é ótimo porque esse é o trabalho dos aplicativos que reconhecem a rede. Ao desenvolver esse aplicativo, você pode percorrer os aros para usar PUT em vez do POST e, em seguida, mais aros para dar um certo tipo de erro no servidor se detectar solicitações duplicadas. De volta ao cliente, você precisa pular etapas para interpretar esses erros, buscar novamente, revalidar e republicar.
Ou você pode fazer o seguinte : considere suas solicitações inseguras como recursos efêmeros para um único usuário (vamos chamá-los de ações). Os clientes solicitam uma nova "ação" em um recurso substantivo com um POST vazio para o recurso. O POST será usado apenas para isso. Uma vez em posse do URI da ação recém-criada com segurança, o cliente coloca a solicitação insegura no URI da ação, não no recurso de destino . Resolver a ação e atualizar o recurso "real" é o trabalho da sua API e é aqui dissociado da rede não confiável.
O servidor faz o negócio, retorna a resposta e a armazena na URI de ação acordada . Se algo der errado, o cliente repetirá a solicitação (comportamento natural!) E, se o servidor já a tiver visto, repetirá a resposta armazenada e não fará mais nada .
Você identificará rapidamente a semelhança com as promessas: criamos e devolvemos o espaço reservado para o resultado antes de fazer qualquer coisa. Também como uma promessa, uma ação pode ter sucesso ou falhar uma vez, mas seu resultado pode ser buscado repetidamente.
O melhor de tudo é que damos aos aplicativos de envio e recebimento a chance de vincular a ação identificada exclusivamente à exclusividade em seus respectivos ambientes. E podemos começar a exigir e impor !, comportamento responsável dos clientes: repita suas solicitações o quanto quiser, mas não gere uma nova ação até que você possua um resultado definitivo da existente.
Como tal, numerosos problemas espinhosos desaparecem. Solicitações de inserção repetidas não criarão duplicatas e não criaremos o recurso real até que possuamos os dados. (as colunas do banco de dados podem permanecer não anuláveis). Solicitações de atualização repetidas não atingem estados incompatíveis e não substituem as alterações subseqüentes. Os clientes podem (re) buscar e processar sem problemas a confirmação original por qualquer motivo (falha do cliente, falta de resposta etc.).
Solicitações de exclusão sucessivas podem ver e processar a confirmação original, sem ocorrer um erro 404. Se as coisas demorarem mais do que o esperado, podemos responder provisoriamente e temos um local onde o cliente pode verificar novamente o resultado definitivo. A parte mais legal desse padrão é sua propriedade Kung-Fu (Panda). Tomamos uma fraqueza, a propensão para os clientes repetirem uma solicitação sempre que não entenderem a resposta e a transformarem em uma força :-)
Antes de me dizer que isso não é RESTful, considere as inúmeras maneiras pelas quais os princípios REST são respeitados. Os clientes não constroem URLs. A API permanece detectável, embora com uma pequena alteração na semântica. Os verbos HTTP são usados adequadamente. Se você acha que essa é uma grande mudança para implementar, posso dizer por experiência que não é.
Se você acha que terá enormes quantidades de dados para armazenar, vamos falar sobre volumes: uma confirmação típica de atualização é uma fração de um kilobyte. Atualmente, o HTTP oferece um ou dois minutos para responder definitivamente. Mesmo que você armazene ações apenas por uma semana, os clientes terão muitas chances de alcançá-los. Se você tiver volumes muito altos, convém um armazenamento de valores-chave dedicado compatível com ácido ou uma solução na memória.
fonte
Além das diferenças sugeridas por outros, quero adicionar mais uma.
No método POST , você pode enviar parâmetros de corpo em
form-data
No método PUT , você deve enviar parâmetros de corpo em
x-www-form-urlencoded
Cabeçalho
Content-Type:application/x-www-form-urlencoded
De acordo com isso, você não pode enviar arquivos ou dados de várias partes no método PUT
EDITAR
O que significa que se você tiver que enviar
você deve usar o método POST
fonte
Sempre parece haver alguma confusão sobre quando usar o HTTP POST versus o método HTTP PUT para serviços REST. A maioria dos desenvolvedores tentará associar operações CRUD diretamente aos métodos HTTP. Argumentarei que isso não está correto e não se pode simplesmente associar os conceitos CRUD aos métodos HTTP. Isso é:
É verdade que o R (etrieve) e D (elete) das operações CRUD podem ser mapeados diretamente para os métodos HTTP GET e DELETE, respectivamente. No entanto, a confusão está nas operações C (reate) e U (atualização). Em alguns casos, é possível usar o PUT para criar, enquanto em outros casos um POST será necessário. A ambiguidade está na definição de um método HTTP PUT versus um método HTTP POST.
De acordo com as especificações do HTTP 1.1, os métodos GET, HEAD, DELETE e PUT devem ser idempotentes e o método POST não é idempotente. Isso significa que uma operação é idempotente se puder ser executada em um recurso uma ou várias vezes e sempre retornar o mesmo estado desse recurso. Enquanto uma operação não idempotente pode retornar um estado modificado do recurso de uma solicitação para outra. Portanto, em uma operação não idempotente, não há garantia de que alguém receberá o mesmo estado de um recurso.
Com base na definição idempotente acima, minha opinião sobre o método HTTP PUT versus o método HTTP POST para serviços REST é: Use o método HTTP PUT quando:
Nos dois casos, essas operações podem ser executadas várias vezes com os mesmos resultados. Esse é o recurso não será alterado solicitando a operação mais de uma vez. Portanto, uma verdadeira operação idempotente. Use o método HTTP POST quando:
Conclusão
Não correlacione e mapeie diretamente operações CRUD para métodos HTTP para serviços REST. O uso de um método HTTP PUT versus um método HTTP POST deve ser baseado no aspecto idempotente dessa operação. Ou seja, se a operação for idempotente, use o método HTTP PUT. Se a operação não for idempotente, use o método HTTP POST.
fonte
Então você usa POST e provavelmente, mas não é necessário, PUT para criação de recursos. Você não precisa apoiar os dois. Para mim, o POST é perfeitamente suficiente. Portanto, é uma decisão de design.
Como sua cotação mencionou, você usa PUT para criar um recurso não atribuído a um IRI e deseja criar um recurso de qualquer maneira. Por exemplo,
PUT /users/123/password
geralmente substitui a senha antiga por uma nova, mas você pode usá-la para criar uma senha se ela ainda não existir (por exemplo, por usuários registrados recentemente ou restaurando usuários banidos).fonte
Vou pousar com o seguinte:
PUT refere-se a um recurso identificado pelo URI. Nesse caso, você está atualizando. É a parte dos três verbos que se referem aos recursos - excluir e começar a ser os outros dois.
O POST é basicamente uma mensagem de forma livre, com seu significado sendo definido como "fora da banda". Se a mensagem puder ser interpretada como adicionando um recurso a um diretório, tudo bem, mas basicamente você precisa entender a mensagem que está enviando (postando) para saber o que acontecerá com o recurso.
Como PUT, GET e DELETE se referem a um recurso, eles também são, por definição, idempotentes.
O POST pode executar as outras três funções, mas a semântica da solicitação será perdida nos intermediários, como caches e proxies. Isso também se aplica ao fornecimento de segurança no recurso, pois o URI de uma postagem não indica necessariamente o recurso ao qual está sendo aplicado (pode ser).
Um PUT não precisa ser uma criação; o serviço poderá ter erro se o recurso ainda não estiver criado, mas atualizá-lo. Ou vice-versa - ele pode criar o recurso, mas não permitir atualizações. A única coisa necessária sobre o PUT é que ele aponta para um recurso específico e sua carga útil é a representação desse recurso. Uma PUT bem-sucedida significa (exceto interferência) que um GET recuperaria o mesmo recurso.
Editar: Mais uma coisa - um PUT pode criar, mas, se o fizer, o ID deve ser um ID natural - também conhecido como endereço de email. Dessa forma, quando você coloca duas vezes, o segundo put é uma atualização do primeiro. Isso o torna idempotente .
Se o ID for gerado (um novo ID de funcionário, por exemplo), o segundo PUT com a mesma URL criará um novo registro, o que viola a regra de idempotência. Nesse caso, o verbo seria POST e a mensagem (não recurso) seria criar um recurso usando os valores definidos nesta mensagem.
fonte
A semântica deve ser diferente, pois "PUT", como "GET", deve ser idempotente - o que significa que você pode solicitar exatamente o mesmo PUT várias vezes e o resultado será como se você a executasse apenas uma vez.
Descreverei as convenções que considero mais utilizadas e mais úteis:
Quando você coloca um recurso em um URL específico, o que acontece é que ele deve ser salvo nesse URL ou algo nesse sentido.
Quando você posta para um recurso em um URL específico, geralmente está postando uma informação relacionada a esse URL. Isso implica que o recurso no URL já existe.
Por exemplo, quando você deseja criar um novo fluxo, você pode COLOCÁ-lo em algum URL. Mas quando você deseja POSTAR uma mensagem em um fluxo existente, você POST na URL.
Quanto à modificação das propriedades do fluxo, você pode fazer isso com PUT ou POST. Basicamente, use apenas "PUT" quando a operação for idempotente - caso contrário, use POST.
Observe, no entanto, que nem todos os navegadores modernos oferecem suporte a verbos HTTP que não sejam GET ou POST.
fonte
Na maioria das vezes, você os usará assim:
Por exemplo:
Nos dois casos, o corpo da solicitação contém os dados para o recurso a ser criado ou atualizado. Deveria ser óbvio pelos nomes das rotas que o POST não é idempotente (se você chamá-lo 3 vezes, ele criará 3 objetos), mas PUT é idempotente (se você chamá-lo 3 vezes o resultado é o mesmo). PUT é frequentemente usado para operação "upsert" (criar ou atualizar), mas você sempre pode retornar um erro 404 se desejar usá-lo apenas para modificar.
Observe que o POST "cria" um novo elemento na coleção e PUT "substitui" um elemento em uma determinada URL, mas é uma prática muito comum usar o PUT para modificações parciais, ou seja, usá-lo apenas para atualizar os recursos existentes e modifique apenas os campos incluídos no corpo (ignorando os outros campos). Tecnicamente, isso está incorreto. Se você deseja ser purista de REST, o PUT deve substituir todo o recurso e você deve usar PATCH para a atualização parcial. Pessoalmente, não me importo tanto quanto o comportamento é claro e consistente em todos os pontos de extremidade da API.
Lembre-se de que REST é um conjunto de convenções e diretrizes para manter sua API simples. Se você terminar com uma solução alternativa complicada apenas para marcar a caixa "RESTfull", estará derrotando o objetivo;)
fonte
Embora exista provavelmente uma maneira agnóstica de descrevê-las, parece estar em conflito com várias declarações de respostas a sites.
Sejamos claros e diretos aqui. Se você é um desenvolvedor .NET trabalhando com API da Web, os fatos são (da documentação da API da Microsoft), http://www.asp.net/web-api/overview/creating-web-apis/creating-a-web -api-that-support-crud-operations :
Claro que você "pode" usar o "POST" para atualizar, mas basta seguir as convenções estabelecidas para você com sua estrutura fornecida. No meu caso, é .NET / Web API, então PUT é para UPDATE, não há debate.
Espero que isso ajude os desenvolvedores da Microsoft que leem todos os comentários nos links dos sites Amazon e Sun / Java.
fonte
Aqui está uma regra simples:
Colocar em um URL deve ser usado para atualizar ou criar o recurso que pode ser localizado nesse URL.
O POST para uma URL deve ser usado para atualizar ou criar um recurso localizado em outra URL ("subordinada") ou que não seja localizável via HTTP.
fonte
Se você estiver familiarizado com as operações do banco de dados, existem
Eu uso
PUT
para Mesclar e atualizo como operações e usoPOST
para Inserções.fonte
Na prática, o POST funciona bem para criar recursos. A URL do recurso recém-criado deve ser retornada no cabeçalho de resposta do local. PUT deve ser usado para atualizar completamente um recurso. Por favor, entenda que essas são as práticas recomendadas ao projetar uma API RESTful. A especificação HTTP, como tal, não restringe o uso de PUT / POST com algumas restrições para criar / atualizar recursos. Dê uma olhada em http://techoctave.com/c7/posts/71-twitter-rest-api-dissected que resume as melhores práticas.
fonte