Como enviar o conteúdo do arquivo como entidade do corpo usando cURL

207

Estou usando o utilitário de linha de comando cURL para enviar HTTP POST para um serviço da web. Quero incluir o conteúdo de um arquivo como a entidade do corpo do POST. Eu tentei usar -d </path/to/filename>, bem como outras variantes, com informações de tipo como --data </path/to/filename> --data-urlencode </path/to/filename>etc ... o arquivo está sempre anexado. Eu preciso disso como a entidade do corpo.

Roy Hinkley
fonte

Respostas:

338

Eu acredito que você está procurando a @filenamesintaxe, por exemplo:

descascar novas linhas

curl --data "@/path/to/filename" http://...

mantenha novas linhas

curl --data-binary "@/path/to/filename" http://...

=====

curl removerá todas as novas linhas do arquivo. Se você deseja enviar o arquivo com novas linhas intactas, use --data-binaryno lugar de --data

Jeffrey Froman
fonte
21
Se você quer ser realmente chique, pode fazer: cat file.txt | curl --data "@-" `(< url.txt )` @-manda o curl ler do stdin. Você também pode usar o redirecionamento (< x.txt )para colocar o que quiser. Se você estiver usando o bash.
quer tocar hoje
62
curl removerá todas as novas linhas do arquivo. Se você deseja enviar o arquivo com novas linhas intactas, use --data-binaryno lugar de --data.
Chris
Agora, como adicionar credenciais de login para autorizar esta solicitação?
anon58192932
@ anon58192932 - Isso depende do protocolo de segurança do servidor. Se você estiver usando name:valuepares, como nome de usuário e senha, adicione os cabeçalhos necessários que correspondem ao que o serviço espera: --header: "<header_name>:<header_value>"como uma única sequência.
Roy Hinkley
19

Sei que a pergunta foi respondida, mas no meu caso eu estava tentando enviar o conteúdo de um arquivo de texto para a API do Slack Webhook e, por algum motivo, a resposta acima não funcionou. De qualquer forma, foi isso que finalmente fez o truque para mim:

curl -X POST -H --silent --data-urlencode "payload={\"text\": \"$(cat file.txt | sed "s/\"/'/g")\"}" https://hooks.slack.com/services/XXX
massa de biscoito
fonte
Este não converte pontos em sublinhados (. -> _) e mantém novas linhas. Obrigado!
Ramon Fincken
1
É legal, mas não responde à pergunta, pois o arquivo é explodido na linha de comando em vez de ser especificado para curl. Eu também estou querendo saber se todos os caracteres especiais do shell precisa ser escapado - mas eu não sei o suficiente sobre isso;)
Gerard ONeill
Obrigado, você salvou minha vida!
aryswisnu 03/06
Para um arquivo de conteúdo enorme, a curvatura acima não funciona, curl: argument list too longnesse caso a resposta aceita é salva-vidascurl --data "@/path/to/filename" http://...
Outro codificador
0

No meu caso, @causou algum tipo de problema de codificação, ainda prefiro o meu jeito antigo:

curl -d "$(cat /path/to/file)" https://example.com
wbswjc
fonte