Каков синтаксис командной строки cURL для выполнения запроса POST?

2187

Как я могу сделать запрос POST с помощью инструмента командной строки cURL ?

mic84
источник
curl -d "param1=value1&param2=value2" -X POST http://localhost:3000/data
svikramjeet

Ответы:

2542

С полями:

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

С полями, указанными индивидуально:

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

Multipart:

curl --form "fileupload=@my-file.txt" https://example.com/resource.cgi

Multipart с полями и именем файла:

curl --form "fileupload=@my-file.txt;filename=desired-filename.txt" --form param1=value1 --form param2=value2 https://example.com/resource.cgi

Без данных:

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

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

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

Для получения дополнительной информации см. Руководство по cURL . Curl учебник по эмулировать веб - браузер является полезным.

С помощью libcurl используйте curl_formadd()функцию для создания формы, прежде чем отправлять ее обычным способом. См. Документацию libcurl для получения дополнительной информации.

Для больших файлов рассмотрите возможность добавления параметров, чтобы показать ход загрузки:

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

-o outputТребуется, в противном случае не будет отображаться не индикатор.

Стивен Декен
источник
7
@LauriRanta --data-urlencode(без черты), по крайней мере, в последних версиях
waitinforatrain
4
Также работает, если вам нужно обновить ресурс с PUT: curl -X PUT ...
Subfuzion
3
У меня проблемы с пониманием ... когда я это сделаю With Fields, когда Multipartи когда Without Data?
CodyBugstein
7
Вместо --dataтебя можно использовать -d.
user35538
у меня есть массив полей. Как я могу это сделать?
ARUNBALAN NV
507

Для RESTful HTTP POST, содержащего XML:

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

или для JSON используйте это:

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

Это прочитает содержимое названного файла filename.txtи отправит его как запрос на публикацию.

soundmonster
источник
13
Объяснение @ tom-wijsman: curl -X POSTподразумевает HTTP-запрос POST, -dпараметр (long version :) --dataсообщает curl, что ниже будут параметры POST, и @filenameопределяет содержимое файла в filenameкачестве параметра. Этот подход лучше всего работает с HTTP-API RESTful, которые можно найти в Twitter, Facebook, различных других веб-сервисах, включая Ruby on Rails, а также HTTP-API баз данных, таких как CouchDB. REST расшифровывается как « Представительный государственный перевод»
soundmonster
1
Как мы можем увидеть ответ XML не в одну строку, а отформатирован?
Виталий Зданевич
6
Я думаю, что вы можете отказаться от, -X POSTпоскольку это подразумевается -d.
benjifisher
Как дать несколько заголовков?
Кея
Несколько заголовков: curl -H "header2: 1" -H "header2: 2" ...
Томаш Кратохвила
131

Данные из stdin с -d @-

Пример:

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

Выход:

<p>Hello <strong>world</strong>!</p>
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник
6
Отлично, если у вас уже есть объект JSON в буфере обмена
Luca Steeb
еще лучше: echo "$ message" | curl -H "Content-Type: application / json" -d @ - "$ url"
rzr
66
curl -d "name=Rafael%20Sagula&phone=3320780" http://www.where.com/guest.cgi 

это пример, найденный в руководстве к примеру Curl .

Используйте% 26 для амперсандов, хотя, если вышеперечисленное не работает:

curl -d "name=Rafael%20Sagula%26phone=3320780" http://www.where.com/guest.cgi 
Патрик Дежарден
источник
61

Если вы хотите войти на сайт, сделайте следующее:

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

Первый запрос сохраняет файл cookie сеанса (который предоставляется при успешном входе в систему) в файл «заголовки». Отныне вы можете использовать этот файл cookie для аутентификации вас в любой части веб-сайта, к которой вы обычно обращаетесь после входа в браузер.

Мартин Конечни
источник
6
примечание со справочной страницы curl: «Опция -c, --cookie-jar - лучший способ хранения файлов cookie».
maxschlepzig
32
curl -v --data-ascii var=value http://example.com

и есть еще много вариантов, проверьте curl --helpдля получения дополнительной информации.

Винко Врсалович
источник
27

Если вы ленивый, вы можете получить Google-Chrome, чтобы сделать всю работу за вас.

  1. Щелкните правой кнопкой мыши форму, которую вы хотите отправить, и выберите « Проверить» . Это откроет панель DevTools.
  2. Выберите вкладку « Сеть » в devtools и установите флажок « Сохранить журнал» .
  3. Отправьте форму и найдите запись с методом POST (щелкните правой кнопкой мыши заголовок любого столбца и убедитесь, что метод отмечен).
  4. Щелкните правой кнопкой мыши строку POST и выберите « Копировать» > « Копировать как cURL» .

chrome devtools: копировать как cURL

Chrome скопирует все данные запроса в синтаксисе cURL.

В Chrome --data 'param1=hello&param2=world'вы можете сделать его более читабельным, используя один -dили несколько -Fпараметров, в зависимости от того, какой тип запроса POST вы хотите отправить, который может быть одним application/x-www-form-urlencodedили multipart/form-dataсоответствующим.

Это будет POST-ed как application/x-www-form-urlencoded( используется для большинства форм, которые не содержат загрузки файлов ):

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

Для использования multipart/form-dataPOST -F( обычно используется с формами, которые содержат загрузку файлов, или где важен порядок полей, или где требуются несколько полей с одинаковым именем ):

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

User-AgentЗаголовок обычно не требуется, но я бросил его в всяком случае. Вы можете избежать установки пользовательского агента на каждый запрос, создав ~/.curlrcфайл, который содержит, например,User-Agent: "Mozilla/2.2"

ccpizza
источник