Como fazer uma solicitação PUT com curl?

412

Como testar um método RESTful PUT (ou DELETE) usando curl?

John
fonte

Respostas:

566

Usando o -Xsinalizador com o verbo HTTP que você deseja:

curl -X PUT -d arg=val -d arg2=val2 localhost:8080

Este exemplo também usa o -dsinalizador para fornecer argumentos com sua solicitação PUT.

theabraham
fonte
17
"man curl" em -X: "Normalmente você não precisa dessa opção. Todos os tipos de solicitações GET, HEAD, POST e PUT são invocadas usando opções de linha de comando dedicadas." Mas não consegui encontrar outra maneira.
Martin C. Martin
44
Um ano depois, encontrei um caminho! curl -T
Martin C. Martin
2
Como a resposta de Martin C. Martin também muda para GET após um redirecionamento do servidor, essa é a resposta mais útil na minha opinião.
Martin
2
Para obter o GETredirecionamento após, adicione o parâmetro--location
Martin M
1
Enrolar 7.47 e isso não funcionaria para mim. A resposta de theabraham sempre assume como padrão o comportamento postado. --get (ou -G), no entanto, forçará os campos -d (--data) a se tornarem parâmetros de URL e funciona.
James Powell
101

Resposta rápida:

Em uma única linha, o comando curl seria:

a) Se estiver enviando dados do formulário:

curl -X PUT -H "Content-Type: multipart/form-data;" -F "key1=val1" "YOUR_URI"

b) Se estiver enviando dados brutos como json:

curl -X PUT -H "Content-Type: application/json" -d '{"key1":"value"}' "YOUR_URI"

c) Se estiver enviando um arquivo com uma solicitação POST:

curl -X POST "YOUR_URI" -F 'file=@/file-path.csv'

Solução alternativa:

Você pode usar o aplicativo POSTMAN da Chrome Store para obter a solicitação cURL equivalente. Isso é especialmente útil ao escrever solicitações mais complicadas.

Para a solicitação com outros formatos ou para diferentes clientes como java, PHP, você pode conferir o POSTMAN / comment abaixo.

POSTMAN para obter o código de solicitação

Prateek
fonte
4
Não faço ideia por que isso foi prejudicado ... Copiei aqui a idéia de como passar o corpo JSON para curl PUT. Também carteiro é uma ferramenta muito legal para obter o código onda para consultas mais complicadas :)
Mikael Lepistö
2
Obrigado !! Mesmo eu não tenho nenhuma idéia do porquê dos votos negativos. Pode haver relutância dos usuários em adotá-lo. Criei uma respo de todas as minhas APIs REST para dispositivos móveis no POSTMAN e essa é a melhor dica de produtividade que posso sugerir para quem trabalha com REST.
Prateek
Exemplo do mundo real onde estou passando dados e parâmetros json no ponto final; curl -X PUT -H "Tipo de conteúdo: application / json" -d '{"amount": "999", "type": "car", "parent_id": "12345"}' localhost: 8080 / transactionervice / transaction / 2222
vikramvi 6/17
1
Ter que instalar um navegador completo (se não houver o Chrome) e uma extensão para ele pode ser um exagero para algumas pessoas. Pelo menos você poderia ter fornecido uma alternativa para outro navegador da Web mais comum (instalação padrão) como o Firefox, onde o HttpRequester faz um trabalho semelhante.
Rbaleksandar #
5
Pode ter voto negativo, porque a pergunta é sobre ondulação.
precisa saber é o seguinte
28

Um exemplo de PUT após o comentário de Martin C. Martin:

curl -T filename.txt http://www.example.com/dir/

Com -T(igual a --upload-file), o curl usará PUT para HTTP.

Tor Klingberg
fonte
8
Infelizmente, isso -Tnão substitui -X PUTse você deseja especificar parâmetros com -dou -F. -Tenvia o conteúdo de um arquivo via PUT. Para obter o GETredirecionamento após, adicione o parâmetro--location
Martin M
e se filename.txt estiver no servidor remoto?
bosari
7
curl -X PUT -d 'new_value' URL_PATH/key

Onde,

X - opção a ser usada para o comando request

d - opção a ser usada para colocar dados em url remoto

URL_PATH - URL remoto

new_value - valor que queremos colocar na chave do servidor

Kalyani Chaudhari
fonte
5

Estou atrasado para esta discussão, mas eu também tinha um requisito semelhante. Como meu script estava construindo a solicitação de ondulação dinamicamente, eu queria uma estrutura semelhante do comando em GET, POST e PUT.

Aqui está o que funciona para mim

Para solicitação PUT :

curl --request PUT --url http://localhost:8080/put --header 'content-type: application/x-www-form-urlencoded' --data 'bar=baz&foo=foo1'

Para solicitação POST :

curl --request POST --url http://localhost:8080/post --header 'content-type: application/x-www-form-urlencoded' --data 'bar=baz&foo=foo1'

Para solicitação GET :

curl --request GET --url 'http://localhost:8080/get?foo=bar&foz=baz'
sunitkatkar
fonte