Как разместить содержимое файла с помощью cURL?

6

Я хочу сделать HTTP POSTиз содержимого (как строка) из локального файла , расположенного по адресу path/to/my-file.txtк URL конечной точки в http://example.com/.

Например, я мог бы сделать следующее:

  1. Извлеките содержимое файла my-file.txtв виде строки.
  2. URL кодирует строку.
  3. Сохраните закодированную строку как переменную с именем foo.

Затем сделайте что-то вроде этого:

curl -d "data=foo" http://example.com/

(На самом деле мне не нужна fooпеременная. Это просто удобный способ описать мой вопрос.)

Какие команды мне нужно будет выполнить это? Нужно ли писать сценарий оболочки? Если так, как это могло бы выглядеть?

Mowzer
источник

Ответы:

10

Согласно последнему разделу -d в man curl :

Если вы начинаете данные с буквы @, остальное должно быть именем файла для чтения данных, или - если вы хотите, чтобы curl считывал данные из stdin. Несколько файлов также могут быть указаны. Публикация данных из файла с именем 'foobar', таким образом, будет выполняться с --data @foobar. Когда --data говорят читать из файла, подобного этому, возврат каретки и перевод строки будут удалены.

То есть вам не нужно ничего делать, просто добавьте к имени файла имя @ .

Гомбай Шандор
источник
2
И если вы хотите, чтобы какая-то полезная оболочка была экранирована (например, чтобы использовать jq для предварительной обработки некоторого JSON, попробуйте: curl ... -d @<(jq '{"schema": . | tostring }' myschema.avsc')Вариант использования: оберните документ JSON в строку другого документа JSON, чтобы передать его в API REST. (Реестр схемы слияния)
Кэмерон Керр
Также имейте в виду, что если вы загружаете двоичные файлы, вы должны использовать --data-binary.
Ахмет Алп Балкан
1

Как уже упоминалось в этом связанном вопросе, если вы хотите, чтобы файл был загружен без каких-либо изменений (возврат каретки / удаление перевода строки), вы можете использовать --data-binaryопцию:

curl -X POST --data-binary @path/to/my-file.txt http://example.com/
Пирз
источник