Qual é a sintaxe da linha de comando cURL para fazer uma solicitação POST?

2187

Como posso fazer uma solicitação POST com a ferramenta de linha de comando cURL ?

mic84
fonte
curl -d "param1=value1&param2=value2" -X POST http://localhost:3000/data
svikramjeet 27/04

Respostas:

2542

Com campos:

curl --data "param1=value1&param2=value2" https://example.com/resource.cgi

Com campos especificados individualmente:

curl --data "param1=value1" --data "param2=value2" https://example.com/resource.cgi

Multipart:

curl --form "[email protected]" https://example.com/resource.cgi

Multipart com campos e um nome de arquivo:

curl --form "[email protected];filename=desired-filename.txt" --form param1=value1 --form param2=value2 https://example.com/resource.cgi

Sem dados:

curl --data '' https://example.com/resource.cgi

curl -X POST https://example.com/resource.cgi

curl --request POST https://example.com/resource.cgi

Para mais informações, consulte o manual cURL . O tutorial cURL sobre como emular um navegador da Web é útil.

Com a libcurl, use a curl_formadd()função para criar seu formulário antes de enviá-lo da maneira usual. Veja a documentação da libcurl para mais informações.

Para arquivos grandes, considere adicionar parâmetros para mostrar o progresso do upload:

curl --tr-encoding -X POST -v -# -o output -T filename.dat \
  http://example.com/resource.cgi

A -o outputé necessária, caso contrário nenhuma barra de progresso aparecerá.

Stephen Deken
fonte
7
@LauriRanta --data-urlencode(no dash), pelo menos nas versões recentes
waitinforatrain 12/02/2013
4
Também funciona se você precisa atualizar um recurso com um PUT: Onda PUT -X ...
Subfuzion
3
Estou tendo problemas para entender ... quando eu faria isso With Fields, quando Multiparte quando Without Data?
CodyBugstein 21/09/2014
7
Em vez de --datavocê pode usar -d.
user35538
Eu tenho uma matriz de campos. como posso fazer isso?
ARUNBALAN NV 9/16
507

Para um POST HTTP RESTful que contém XML:

curl -X POST -d @filename.txt http://example.com/path/to/resource --header "Content-Type:text/xml"

ou para JSON, use isto:

curl -X POST -d @filename.txt http://example.com/path/to/resource --header "Content-Type:application/json"

Isso lerá o conteúdo do arquivo nomeado filename.txte o enviará como a solicitação de postagem.

soundmonster
fonte
13
@ explicação do tom-wijsman: curl -X POSTimplica uma solicitação HTTP POST, o -dparâmetro (versão longa :) --datainforma ao curl que o que se segue serão parâmetros POST e @filenamedesigna o conteúdo do arquivo filenamecomo parâmetro. Essa abordagem funciona melhor com as APIs HTTP RESTful encontradas no Twitter, no Facebook, em vários outros serviços da Web, incluindo Ruby on Rails, bem como nas APIs HTTP de bancos de dados, como o CouchDB. RESTO significa transferência de estado representacional
soundmonster
1
Como podemos ver a resposta xml não em uma linha, mas formatada?
Vitaly Zdanevich 29/07
6
Eu acho que você pode deixar de lado o -X POSTque está implícito -d.
benjifisher
Como dar vários cabeçalhos?
Chave
Vários cabeçalhos: curl -H "header2: 1" -H "header2: 2" ...
Tomáš Kratochvíla
131

Dados do stdin com -d @-

Exemplo:

echo '{"text": "Hello **world**!"}' | curl -d @- https://api.github.com/markdown

Resultado:

<p>Hello <strong>world</strong>!</p>
Ciro Santilli adicionou uma nova foto
fonte
6
Ótimo se você já tem um objeto JSON na área de transferência
Luca Steeb
ainda melhor: echo "$ message" | curl -H "Tipo de conteúdo: application / json" -d @ - "$ url"
rzr 8/17/17
66
curl -d "name=Rafael%20Sagula&phone=3320780" http://www.where.com/guest.cgi 

é o exemplo encontrado no manual de exemplo de ondulação .

Use% 26 para oe comercial, se o acima não funcionar:

curl -d "name=Rafael%20Sagula%26phone=3320780" http://www.where.com/guest.cgi 
Patrick Desjardins
fonte
61

Se você deseja fazer login em um site, faça o seguinte:

curl -d "username=admin&password=admin&submit=Login" --dump-header headers http://localhost/Login
curl -L -b headers http://localhost/

A primeira solicitação salva o cookie da sessão (fornecido após o login bem-sucedido) no arquivo "headers". A partir de agora, você pode usar esse cookie para autenticar você em qualquer parte do site que você costuma acessar após fazer login com um navegador.

Martin Konecny
fonte
6
uma observação da página de manual do curl: 'A opção -c, --cookie-jar é, no entanto, uma maneira melhor de armazenar cookies.'
maxschlepzig
32
curl -v --data-ascii var=value http://example.com

e há muito mais opções, verifique curl --helppara obter mais informações.

Vinko Vrsalovic
fonte
27

Se você é preguiçoso, pode fazer com que o google-chrome faça todo o trabalho por você.

  1. Clique com o botão direito do mouse no formulário que você deseja enviar e selecione Inspecionar . Isso abrirá o painel do DevTools.
  2. Marque a guia Rede no devtools e marque a caixa de seleção Preservar log .
  3. Envie o formulário e localize a entrada com o método POST (clique com o botão direito do mouse em qualquer cabeçalho da coluna e verifique se o Método está marcado).
  4. Clique com o botão direito do mouse na linha com POST e selecione Copiar > Copiar como cURL .

chrome devtools: copie como cURL

O Chrome copiará todos os dados da solicitação na sintaxe cURL.

O Chrome usa --data 'param1=hello&param2=world'que você pode tornar mais legível usando um único parâmetro -dou -Fpor parâmetro, dependendo do tipo de solicitação POST que você deseja enviar, que pode ser uma application/x-www-form-urlencodedou de multipart/form-dataacordo.

Isso será postado como application/x-www-form-urlencoded( usado para a maioria dos formulários que não contêm uploads de arquivos ):

curl http://httpbin.org/post \
    -H "User-Agent: Mozilla/2.2" \
    -d param1=hello \
    -d name=dinsdale

Para multipart/form-datauso em POST -F( normalmente usado com formulários que contêm uploads de arquivos, ou onde a ordem dos campos é importante ou onde vários campos com o mesmo nome são necessários ):

curl http://httpbin.org/post \
    -H "User-Agent: Mozilla/2.2" \
    -F param1=hello \
    -F name=dinsdale \
    -F name=piranha

O User-Agentcabeçalho não é normalmente necessário, mas eu tenho jogado em apenas no caso. Você pode evitar a necessidade de definir o agente do usuário em cada solicitação, criando o ~/.curlrcarquivo que contém, por exemplo,User-Agent: "Mozilla/2.2"

ccpizza
fonte