Перейти к содержимому

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

2097

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

2 412 020 просмотров
mic84 спросил 17 лет назад
M 2 297

7 ответов

2427

С полями:

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Требуется, в противном случае не будет отображаться не индикатор.

@LauriRanta --data-urlencode (без тире), по крайней мере в последних версиях

waitinforatrain · 13 лет назад · 7

Также работает, если вам нужно обновить ресурс с помощью PUT: curl -X PUT ...

Subfuzion · 12 лет назад · 3

У меня проблемы с пониманием ... когда я буду делать это "с полями", когда с "Multipart" и когда "без данных"?

CodyBugstein · 11 лет назад · 3

Вместо --data вы можете использовать -d.

user35538 · 10 лет назад · 6

у меня есть массив полей. Как я могу это сделать?

ARUNBALAN NV · 10 лет назад · 0

@ARUNBALANNV сначала преобразует их в строку с помощью implode

RozzA · 9 лет назад · 0
Stephen Deken ответил 17 лет назад
S 24 409
489

Для 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и отправит его как запрос на публикацию.

Объяснение @ tom-wijsman: curl -X POST подразумевает HTTP-запрос POST, параметр -d (длинная версия: --data) сообщает curl, что последующими будут параметры POST, а @ filename обозначает содержимое файла filename в качестве параметра. Этот подход лучше всего работает с HTTP-API RESTful, которые можно найти в Twitter, Facebook, различных других веб-сервисах, включая Ruby on Rails, а также HTTP-API баз данных, таких как CouchDB. REST означает Передача представительского состояния

soundmonster · 14 лет назад · 12

Как мы можем увидеть ответ XML не в одну строку, а отформатирован?

Vitaly Zdanevich · 10 лет назад · 0

Я думаю, что вы можете опустить -X POST, поскольку это подразумевается -d.

benjifisher · 9 лет назад · 3

Как дать несколько заголовков?

keya · 9 лет назад · 0

Несколько заголовков: curl -H "header2: 1" -H "header2: 2" ...

Tomáš Kratochvíla · 8 лет назад · 0
soundmonster ответил 15 лет назад
S 4 991
121

Данные из stdin : использовать -d @-. Пример:

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

Выход:

<p>Hello <strong>world</strong>!</p> 

Отлично, если у вас уже есть объект JSON в буфере обмена

Luca Steeb · 10 лет назад · 5

еще лучше: echo "$ message" | curl -H "Content-Type: application / json" -d @ - "$ url"

rzr · 8 лет назад · 0
C 3 836
65
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 
Patrick Desjardins ответил 17 лет назад
P 1 249
58

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

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

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

примечание на справочной странице curl: «Опция -c, --cookie-jar, тем не менее, является лучшим способом хранения файлов cookie».

maxschlepzig · 12 лет назад · 4
Martin Konecny ответил 14 лет назад
M 1 077
32
curl -v --data-ascii var=value http://example.com 

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

Vinko Vrsalovic ответил 17 лет назад
V 2 061
18

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

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

chrome devtools: copy as 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 ответил 8 лет назад
C 3 779