Руководство по выполнению запроса curl POST

Узнайте о запросе cURL POST, что это такое, как отправить запрос POST с помощью cURL и многое другое.
4 min read
curl post request guide

curl – это инструмент командной строки для передачи данных по различным сетевым протоколам. Доступный на всех основных операционных системах, curl стал стандартным инструментом для отправки HTTP-запросов из командной строки.

Кроссплатформенная утилита curl поддерживает такие протоколы, как HTTP, HTTPS, FTP и IMAP, что позволяет легко отправлять запросы к API и парсить веб-сайты с помощью curl. Благодаря широкой доступности и поддержке множества протоколов, вы часто можете встретить ссылки на curl в документации по REST API как на быстрый способ тестирования вызовов API непосредственно из командной строки:

Узнайте, как отправлять POST-запросы с помощью curl из командной строки

В этой статье вы узнаете, как отправлять POST-запросы с помощью curl из командной строки.

Что такое POST-запрос

POST-запрос – это метод HTTP для отправки данных на сервер, один из самых распространенных методов HTTP.

Когда вы отправляете POST-запрос, передаваемые данные включаются в тело запроса. Это позволяет отправлять данные более скрытно, чем в URL (как в случае с GET-запросом). Вы также можете отправить значительно больше данных в POST-запросе, обходя ограничения на длину URL, накладываемые браузерами на GET-запросы.

POST-запросы часто используются для отправки форм, загрузки файлов или передачи JSON-данных в API. По сравнению с GET, POST-запросы обычно не кэшируются, и данные не отображаются в истории браузера, поскольку они содержатся в теле запроса.

Как отправить POST-запрос с помощью curl

Прежде чем приступить к этому уроку, вам необходимо установить curl на свой компьютер. Выполните следующую команду, чтобы проверить, установлен ли curl:

curl --version

Если вы получаете ошибку о том, что команда не найдена, вам нужно установить утилиту

Установите curl

Ниже приведены инструкции по установке curl на все основные операционные системы:

Windows

В Windows для установки curl можно использовать WinGet, менеджер пакетов по умолчанию в Windows 11:

winget install curl.curl

Chocolatey – это еще один менеджер пакетов для Windows, который позволяет установить curl с помощью следующей команды:

choco install curl

Linux

curl доступен в большинстве менеджеров пакетов Linux. На Ubuntu/Debian для установки curl используйте следующую команду:

apt-get install curl

Red Hat Enterprise Linux (RHEL), CentOS и Fedora позволяют установить curl с помощью Yellowdog Updater Modified (YUM), например, так:

yum install curl

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

zypper install curl

Наконец, Arch Linux позволяет использовать pacman для установки curl с помощью этой команды:

pacman -Sy curl

macOS

Homebrew – это самый простой способ установить curl на macOS. Убедитесь, что у вас установлен Homebrew, а затем выполните следующую команду:

brew install curl

Теперь, когда вы установили curl на свою операционную систему, вы готовы узнать, как выполнять POST-запросы.

Выполните POST-запрос

curl позволяет указать несколько параметров при отправке POST-запросов. В следующих разделах будут показаны некоторые общие возможности curl, с которыми вы можете столкнуться при выполнении POST-запросов с помощью этой утилиты.

Укажите метод POST

При выполнении HTTP-запросов с помощью curl необходимо указать HTTP-метод, который вы хотите использовать. К HTTP-методам относятся GET, POST, PUT и DELETE. curl позволяет указать HTTP-метод, который вы хотите использовать, с помощью флага командной строки -X.

Например, чтобы отправить POST-запрос на https://httpbin.org/anything, вы можете выполнить в терминале следующую команду curl:

curl -X POST https://httpbin.org/anything

httpbin.org повторяет тело запроса и заголовки в ответе. Ваш ответ должен выглядеть следующим образом:

{
  "args": {},
  "data": "",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Флаг -X POST эквивалентен использованию флага --request POST, поэтому вы также можете выполнить следующую команду и получить тот же результат:

curl --request POST https://httpbin.org/anything

Ответ выглядит так же, как и предыдущий.

Подробнее о флагах -X и --request вы можете прочитать в официальной документации.

Установите тип содержимого

При отправке POST-запроса важно указать тип отправляемого содержимого в теле запроса, чтобы сервер мог правильно интерпретировать тело запроса. Вы можете использовать типы MIME в заголовке Content-Type в HTTP-запросе, чтобы указать формат тела запроса.

Например, если вы отправляете JSON в теле запроса, вам нужно указать веб-серверу, что он ожидает JSON-содержимое, установив в заголовке Content-Type значение application/json. Если вы отправляете XML, заголовок Content-Type должен быть application/xml. Для получения дополнительной информации ознакомьтесь с официальной документацией по Content-Type.

curl позволяет задать заголовки для HTTP-запроса с помощью флага -H. Например, если вы отправляете JSON в POST-запросе, следующая команда curl показывает, как вы можете установить заголовок Content-Type для запроса:

curl -X POST -H 'Content-Type: application/json' -d '{}' https://httpbin.org/anything

В ответе можно увидеть, что в заголовке Content-Type установлено значение application/json:

{
  "args": {},
  "data": "{}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "2",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=-11111111-111111111111111111111111"
  },
  "json": {},
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Флаг -H также может быть указан с помощью более длинного флага --header. В этом случае ваша команда curl будет выглядеть следующим образом:

curl -X POST --header 'Content-Type: application/json' -d '{}' https://httpbin.org/anything

Ваш ответ будет выглядеть так же, как и предыдущий.

Отправьте данные

Вы могли заметить, что в предыдущих командах был флаг -d. Этот флаг позволяет указать данные для отправки в теле запроса. С помощью этого флага можно передать любую строку значений, заключенную в кавычки, например, так:

curl -X POST -H 'Content-Type: application/json' -d '{
    "FirstName": "Joe", 
    "LastName": "Soap" 
}' https://httpbin.org/anything

Вы заметите, что httpbin.org показывает данные тела, которые вы отправили, в свойстве data ответа.

Если у вас есть файл с данными, которые вы хотите, чтобы curl отправил в тело запроса, укажите имя файла с префиксом @. Следующая команда считывает содержимое файла body.json и отправляет его в теле запроса:

curl -X POST -H 'Content-Type: application/json' -d @body.json https://httpbin.org/anything

В этом случае файл body.json содержит следующее:

{
    "FirstName": "Joe",
    "LastName": "Soap"
}

При отправке этого сообщения httpbin.org должен вернуть следующий ответ:

{
  "args": {},
  "data": "{\t\"FirstName\": \"Joe\",\t\"LastName\": \"Soap\"}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "41",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Флаг--data ведет себя так же, как и -d, поэтому их можно использовать как взаимозаменяемые.

Отправьте данные в формате JSON

В предыдущем разделе вы узнали, как можно отправить JSON-данные, установив в заголовке Content-Type значение application/json, а затем передав JSON-данные с помощью флага -d. При отправке запроса также важно сообщить веб-серверу, какой формат данных вы ожидаете получить в ответ. Вы можете использовать заголовок Accept со значением application/json, чтобы сообщить веб-серверу, что вы хотите получить ответ в формате JSON.

Следующая команда отправляет запрос JSON на сервер и сообщает серверу, что вы хотите получить JSON в ответ:

curl -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -d '{
    "FirstName": "Joe",
    "LastName": "Soap"
}' https://httpbin.org/anything

Вы заметите, что свойства data и json в теле ответа содержат данные JSON, которые вы отправили в запросе:

{
  "args": {},
  "data": "{\n    \"FirstName\": \"Joe\",\n    \"LastName\": \"Soap\"\n}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json",
    "Content-Length": "50",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Отправка и получение JSON-данных – обычное дело при отправке HTTP-запросов, поэтому curl предлагает флаг --json, который устанавливает для вас заголовки Content-Type и Accept и отправляет JSON-данные в теле запроса. Используя этот флаг, вы можете сократить свою команду для отправки JSON в POST-запросе:

curl -X POST --json '{
    "FirstName": "Joe",
    "LastName": "Soap"
}' https://httpbin.org/anything

Это дает тот же ответ, что и раньше:

{
  "args": {},
  "data": "{\n    \"FirstName\": \"Joe\",\n    \"LastName\": \"Soap\"\n}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json",
    "Content-Length": "50",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Флаг--json был выпущен в версии 7.82 curl в марте 2022 года, поэтому перед его использованием убедитесь, что у вас установлена последняя версия curl.

Отправка XML-данных

Curl также позволяет отправлять данные в других форматах, например XML. Чтобы отправить XML-данные, необходимо установить в заголовке Content-Type значение application/xml и передать XML-данные в теле запроса с помощью флага -d. Вы также можете сообщить веб-серверу, что ожидаете получить ответ в формате XML, установив в заголовке Accept значение application/xml.

Следующая команда показывает, как можно отправить XML-объект в POST-запросе с помощью curl:

curl -X POST -H 'Content-Type: application/xml' -H 'Accept: application/xml' -d '<Person>
    <FirstName>Joe</FirstName>
    <LastName>Soap</LastName>
</Person>' https://httpbin.org/anything

Вы найдете данные XML-запроса в свойстве data, возвращаемом httpbin.org:

{
  "args": {},
  "data": "<Person>\n    <FirstName>Joe</FirstName>\n    <LastName>Soap</LastName>\n</Person>",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/xml",
    "Content-Length": "79",
    "Content-Type": "application/xml",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}
Отправьте данные формы

Вы можете использовать FormData для отправки пар ключ-значение данных на веб-сервер. Как следует из названия, этот формат данных используется при отправке формы на веб-странице. Пары ключ-значение содержат имя поля и значение.

curl позволяет указывать FormData с помощью флага-F или –form. При использовании этого флага укажите имя и значение поля в следующем формате: -F <name=content> or --form <name=content>.

Следующий фрагмент показывает команду curl, которая отправляет POST-запрос с использованием FormData с полями FirstName и LastName:

curl -X POST -F FirstName=Joe -F LastName=Soap https://httpbin.org/anything

Имена и значения полей формы вы найдете в свойстве form объекта ответа httpbin.org:

{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "248",
    "Content-Type": "multipart/form-data; boundary=------------------------e2bb56049a60b8b8",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Используйте флаг -F для каждого поля, которое вы хотите отправить на сервер.

Загрузите файлы

Вы можете использовать FormData для загрузки файлов в POST-запросе, прикрепляя файл к полю. Чтобы сообщить curl о том, что поле FormData содержит файл, введите путь к файлу в значение поля с префиксом @.

Следующая команда curl загружает файл Contract.pdf в ваш рабочий каталог. Для загрузки файла команда использует поле под названием File:

curl -X POST -F [email protected] https://httpbin.org/anything

Ответ содержит весь файл, поэтому он длинный, но должен выглядеть так:

{
  "args": {},
  "data": "",
  "files": {
    "File": "..."
  },
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "246",
    "Content-Type": "multipart/form-data; boundary=------------------------19ed1fc3be4d30c7",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": null,
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Отправьте учетные данные

Многие конечные точки HTTP требуют аутентификации для отправки запросов. Веб-сервер решает, какой метод аутентификации следует использовать. Одним из таких методов является базовая схема аутентификации, которая позволяет отправлять в запросе учетные данные, состоящие из имени пользователя и пароля. Затем сервер проверяет учетные данные и, если они верны, обрабатывает запрос

сurl упрощает отправку базовых учетных данных аутентификации с помощью флага -u или --user. Затем вы указываете имя пользователя и пароль, разделяя их символом : (двоеточие), например: -u <username:password>.

Следующий фрагмент использует curl для отправки POST-запроса с учетными данными пользователя и телом в формате JSON:

curl -X POST -u 'admin:password123' --json '{
    "FirstName": "Joe",
    "LastName": "Soap"
}' https://httpbin.org/anything

Обратите внимание, как curl кодирует имя пользователя и пароль и отправляет их в заголовке Authorization:

{
  "args": {},
  "data": "{\n    \"FirstName\": \"Joe\",\n    \"LastName\": \"Soap\"\n}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json",
    "Authorization": "Basic YWRtaW46cGFzc3dvcmQxMjM=",
    "Content-Length": "50",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
    "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111"
  },
  "json": {
    "FirstName": "Joe",
    "LastName": "Soap"
  },
  "method": "POST",
  "origin": "0.0.0.0",
  "url": "https://httpbin.org/anything"
}

Заключение

В этой статье вы узнали, как отправлять POST-запросы с помощью утилиты командной строки curl. Вы поняли, как использовать флаг -X, чтобы указать, что вы хотите отправить POST-запрос. Вы также установили заголовки Content-Type и Accept с помощью флагов -H и ---header, чтобы веб-сервер знал, в каком формате отправляются данные. Чтобы отправить данные в теле запроса, используйте флаг -d вместе с данными, которые вы хотите отправить.

Вы также увидели несколько примеров отправки нескольких типов данных, включая JSON, XML и FormDataa, и узнали, как отправлять базовые учетные данные аутентификации в запросе с помощью флагов -u и --user.

Хотя в этой статье были показаны основные флаги, входящие в состав curl, и способы их использования, curl предлагает больше возможностей, которые вы можете изучить, включая использование переменных, отправку cookies с запросами и отправку запросов с помощью прокси. Многие языки программирования также предоставляют библиотеки, позволяющие работать с curl из этого языка, включая Python, Node.js и Rust.

Ищете решение для скрапинга? Поговорите с одним из наших экспертов по данным и узнайте, какой из наших продуктов лучше всего подходит для ваших потребностей.