Как отправить содержимое файла как сущность тела, используя cURL

208

Я использую утилиту командной строки cURL для отправки HTTP POST в веб-службу. Я хочу включить содержимое файла в качестве сущности тела POST. Я пытался использовать, -d </path/to/filename>а также другие варианты с типом информации, как и --data </path/to/filename> --data-urlencode </path/to/filename>т.д ... файл всегда прикреплен. Мне нужно это как сущность тела.

Рой Хинкли
источник

Ответы:

339

Я полагаю, что вы ищете @filenameсинтаксис, например:

лишить новых линий

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

держать новые линии

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

=====

curl удалит все новые строки из файла. Если вы хотите отправить файл без изменений, используйте --data-binaryвместо --data

Джеффри Фроман
источник
21
Если вы хотите быть по-настоящему модным, вы можете это сделать: cat file.txt | curl --data "@-" `(< url.txt )` @-говорит curl читать из stdin. Вы также можете просто использовать перенаправление, (< x.txt )чтобы вставить все, что вы хотите. Если вы используете Bash.
Breedly
62
curl удалит все новые строки из файла. Если вы хотите отправить файл с новыми строками, используйте --data-binaryвместо --data.
Крис
Теперь, как добавить учетные данные для авторизации этого запроса?
anon58192932
@ anon58192932 - Это зависит от протокола безопасности сервера. Если вы используете name:valueпары, такие как имя пользователя и пароль, добавьте необходимые заголовки, соответствующие ожиданиям службы: --header: "<header_name>:<header_value>"в виде одной строки.
Рой Хинкли
19

Я знаю, что на вопрос был дан ответ, но в моем случае я пытался отправить содержимое текстового файла в API Slack Webhook, и по какой-то причине вышеуказанный ответ не сработал. Во всяком случае, это то, что, наконец, помогло мне:

curl -X POST -H --silent --data-urlencode "payload={\"text\": \"$(cat file.txt | sed "s/\"/'/g")\"}" https://hooks.slack.com/services/XXX
тесто для печенья
источник
Этот не преобразует точки в подчеркивания (. -> _) и сохраняет новые строки. Спасибо!
Рамон Финкен
1
Это круто, но не отвечает на вопрос, так как файл взорван в командной строке, а не указан для curl. Мне также интересно, нужно ли экранировать все специальные символы оболочки - но я не знаю достаточно об этом;)
Джерард ONeill
Спасибо, ты спас мне жизнь!
aryswisnu
Для огромного файла содержимого выше curl не будет работать, curl: argument list too longв этом случае принятый ответ спасает жизньcurl --data "@/path/to/filename" http://...
Другой кодер
0

В моем случае, @вызвало какую-то проблему с кодировкой, я все же предпочитаю свой старый способ:

curl -d "$(cat /path/to/file)" https://example.com
wbswjc
источник