отправка / публикация XML-файла с помощью командной строки curl

389

Как я могу отправить / опубликовать XML-файл на локальном сервере http: // localhost: 8080, используя curl из командной строки?

Какую команду я должен использовать?

Арнаб Сен Гупта
источник

Ответы:

507

Если этот вопрос связан с вашими другими вопросами Hudson, используйте команду, которую они предоставляют. Вот так с XML из командной строки:

$ curl -X POST -d '<run>...</run>' \
http://user:pass@myhost:myport/path/of/url

Вам нужно немного изменить его, чтобы прочитать из файла:

 $ curl -X POST -d @myfilename http://user:pass@myhost:myport/path/of/url

Прочтите справочную страницу . после абстрактного параметра -d.

-d / - данные

(HTTP) Отправляет указанные данные в запросе POST на HTTP-сервер так же, как браузер, когда пользователь заполняет HTML-форму и нажимает кнопку отправки. Это заставит curl передавать данные на сервер с помощью application-type / x-www-form-urlencoded. Сравните с -F / - формой.

-d / - данные такие же, как --data-ascii. Чтобы публиковать данные исключительно в двоичном формате, вы должны использовать опцию --data-binary. Для URL-кодирования значения поля формы вы можете использовать --data-urlencode.

Если какой-либо из этих параметров используется более одного раза в одной командной строке, указанные фрагменты данных будут объединены с разделительным символом & -symbol. Таким образом, использование '-d name = daniel -d skill = lousy' сгенерирует пост-чанк, который выглядит как 'name = daniel & skill = lousy'.

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

Питер Шютце
источник
2
Прочтите справочную страницу. The contents of the file must already be URL-encoded.XML-файлы OP, конечно же, нет.
полковник Паник
52
Пока вы указываете тип контента, --header "Content-Type:application/xml"вы не должны кодировать URL
полковник Panic
12
Я просто добавлю, что если вы используете "-d", то по умолчанию используется POST, поэтому нет необходимости использовать "-X".
Тал Лирон
4
если вы используете параметр перенаправления curl -L, не используйте -X POSTего, так как перенаправленный запрос также будет использовать POST. Если вы просто используете -d, как подсказывает @Tai, этого не произойдет
Тристан Хавелик
18
Имейте в виду, что -dполоски переносятся из файлов. Чтобы избежать этого, используйте --data-binaryвместо этого.
Яр
189

Из справочной страницы я считаю, что это те дроиды, которых вы ищете:

-F/--form <name=content>

(HTTP) Это позволяет curl эмулировать заполненную форму, в которой пользователь нажал кнопку отправки. Это вызывает скручивание в POST-данные с использованием multipart / form-data Content-Type в соответствии с RFC2388. Это позволяет загружать двоичные файлы и т. Д. Чтобы часть содержимого была файлом, добавьте к имени файла знак @.

Например, для отправки вашего файла паролей на сервер, где «пароль» - это имя поля формы, в которое / etc / passwd будет вводиться:

curl -F password=@/etc/passwd www.mypasswords.com

Так что в вашем случае это было бы что-то вроде
curl -F file=@/some/file/on/your/local/disk http://localhost:8080

Писквор покинул здание
источник
11
Это решение имеет дополнительное преимущество, заключающееся в возможности присвоения имени отправляемому файлу (в отличие от выбранного выше решения), и, следовательно, вы можете, например, отправить несколько файлов.
Дэвид Кэрнс
13
Формат file=@-полезен, если вы хотите передать свой файл.
Стивен Лу
2
Если кто-то хочет отправить файл и другую информацию: используйте -F key = val -F key = val столько раз, сколько вам нужно. Заключение всех параметров записи в одну большую строку, разделенную символом &, не работает.
хголов
Можете ли вы упомянуть, как подготовить принимающую веб-страницу, чтобы иметь возможность получать файлы, загруженные с помощью curl, с рабочего стола?
SexyBeast
@Cupidvogel: Как и любое другое поле загрузки файла; Специальная обработка для скручивания отсутствует.
Писквор покинул здание
47

Вы можете использовать опцию --data с файлом.

Запишите содержимое XML в файл с именем soap_get.xml и с помощью команды curl отправьте запрос:

curl -X POST --header "Content-Type: text / xml; charset = UTF-8" --data @ soap_get.xml your_url

NgaNguyenDuy
источник
Это должен быть ответ, так как ФП просит о публикации файла, а не встроенного текста.
FearlessFuture
Это было необходимо для того, чтобы он показывался «не сбежавшим» для меня, используя весенний веб-сервер, спасибо!
rogerdpack
20

С Дженкинс 1,494, я был в состоянии послать файл параметр задания на Ubuntu Linux 12.10 с использованием curlс --formпараметрами:

curl --form name=myfileparam --form file=@/local/path/to/your/file.xml \
  -Fjson='{"parameter": {"name": "myfileparam", "file": "file"}}' \
  -Fsubmit=Build \
  http://user:password@jenkinsserver/job/jobname/build

На сервере Jenkins я настроил задание, которое принимает один параметр: параметр загрузки файла с именем myfileparam.

Первая строка этого вызова curl создает веб-форму с именем параметра myfileparam(как в задании); его значением будет содержимое файла в локальной файловой системе с именем /local/path/to/your/file.txt. @Префикс символа говорит локон , чтобы послать локальный файл вместо данного файла.

Вторая строка определяет запрос JSON, который соответствует параметрам формы в первой строке: параметру файла с именем myfileparam.

Третья строка активирует кнопку Build формы. Четвертая строка - это URL задания с суффиксом "/ build".

Если этот вызов успешен, curl возвращается 0. Если это не удается, ошибка или исключение из службы выводится на консоль. Этот ответ многое берет из старого поста в блоге, касающегося Хадсона , который я разобрал и переработал для своих собственных нужд.

Стив ХХХ
источник
6

Вот как вы можете POST XML в Windows, используя командную строку curl в Windows. Для этого лучше использовать пакетный файл / .cmd:

curl -i -X POST -H "Content-Type: text/xml" -d             ^
"^<?xml version=\"1.0\" encoding=\"UTF-8\" ?^>                ^
    ^<Transaction^>                                           ^
        ^<SomeParam1^>Some-Param-01^</SomeParam1^>            ^
        ^<Password^>SomePassW0rd^</Password^>                 ^
        ^<Transaction_Type^>00^</Transaction_Type^>           ^
        ^<CardHoldersName^>John Smith^</CardHoldersName^>     ^
        ^<DollarAmount^>9.97^</DollarAmount^>                 ^
        ^<Card_Number^>4111111111111111^</Card_Number^>       ^
        ^<Expiry_Date^>1118^</Expiry_Date^>                   ^
        ^<VerificationStr2^>123^</VerificationStr2^>          ^
        ^<CVD_Presence_Ind^>1^</CVD_Presence_Ind^>            ^
        ^<Reference_No^>Some Reference Text^</Reference_No^>  ^
        ^<Client_Email^>john@smith.com^</Client_Email^>       ^
        ^<Client_IP^>123.4.56.7^</Client_IP^>                 ^
        ^<Tax1Amount^>^</Tax1Amount^>                         ^
        ^<Tax2Amount^>^</Tax2Amount^>                         ^
    ^</Transaction^>                                          ^
" "http://localhost:8080"
Глеб Эсман
источник
Как отформатировать строку xml перед использованием с помощью команды curl
Chinmoy
3

Если у вас есть несколько заголовков, вы можете использовать следующее:

curl -X POST --header "Content-Type:application/json" --header "X-Auth:AuthKey" --data @hello.json Your_url
Dheeraj R
источник
3

Вы можете использовать эту команду:

curl -X POST --header 'Content-Type: multipart/form-data' --header 'Accept: application/json' --header 'Authorization: <<Removed>>' -F file=@"/home/xxx/Desktop/customers.json"  'API_SERVER_URL' -k 
Мусле Уддин
источник
1

Если вы используете curl в Windows:

curl -H "Content-Type: application/xml" -d "<?xml version="""1.0""" encoding="""UTF-8""" standalone="""yes"""?><message><sender>Me</sender><content>Hello!</content></message>" http://localhost:8080/webapp/rest/hello
Пол Варгас
источник