Як надіслати POST-запит за допомогою curl: повний довідник

Як надіслати POST-запит за допомогою curl: повний довідник

Наразі у світі десь працює приблизно двадцять мільярдів інсталяцій curl. Цю цифру вказав творець інструменту, Даніель Стенберг, який майже самостійно його підтримує. Curl встановлюється в маршрутизаторах, автомобілях, супутниках, смарт-телевізорах, серверах Linux, які підтримують більшу частину публічної мережі, та в кожному основному середовищі виконання LLM. З усіх HTTP-дієслів, які ці інсталяції використовують, POST виконує найважчу роботу. За допомогою POST curl більшість розробників вперше тестують, налагоджують або інтегруються з API.

У звіті Postman про стан API за 2025 рік зазначається, що рівень впровадження REST становить 93%. 82% організацій зараз працюють принаймні частково з використанням API. POST – це дієслово, до якого ви звертаєтесь щоразу, коли створюєте, надсилаєте або передаєте дані на сервер. Робоче навантаження штучного інтелекту ще більше прискорило цю тенденцію. Трафік API, пов'язаний з використанням штучного інтелекту, зріс на 73% у 2024 році (Postman, 2024), і документація кожного постачальника LLM тепер відкривається з фрагмента POST у форматі curl як канонічним «першим викликом».

У цьому посібнику описано всі форми, яких може набути POST-запит за допомогою curl, від мінімального рядка до робочого виклику справжнього API криптовалютних платежів. Мета: щось, з чого можна вставляти, а не лише читати. Незалежно від того, чи надсилаєте дані на сервер вперше, чи перебудовуєте обробник вебхука о 2-й годині ночі, наведені нижче шаблони охоплюють те, що вам насправді потрібно.

Наведена нижче таблиця є скороченою версією. Шпаргалка з прапорцями та призначенням, що охоплює параметри командного рядка curl, що найчастіше використовуються під час надсилання POST-запитів. Кожен з них детально описано в наступних розділах.

Прапор Що це робить Коли ти потягнешся до цього
`-X POST`, `--request POST` Примусово переводить метод HTTP-запиту в режим POST Явний метод, або незвичайні дієслова
`-d`, `--дані` Надсилає дані в тілі запиту, автоматично встановлює POST Поля форми, вбудований JSON, прості корисні навантаження
`--binary-data` Надсилає файлові або двійкові дані без видалення символів нового рядка Завантаження файлів, великі JSON-файли, необроблені двійкові дані
`--data-urlencode` URL-кодує значення перед надсиланням Значення з пробілами або спеціальними символами
`--json` Надсилає дані з `Content-Type: application/json` та `Accept: application/json` curl 7.82.0 або новіша версія, JSON API
`-H`, `--заголовок` Додає власний HTTP-заголовок Тип вмісту, авторизація, ключі API
`-F`, `--форма` Надсилає багаточастинні/формні дані з полями форми або файлами Завантаження файлів, форми у стилі HTML
`-u`, `--користувач` Надсилає облікові дані базової автентифікації HTTP Застарілі API, проста автентифікація за ім'ям користувача та паролем
`-i`, `--include` Включає заголовки відповідей у вивід Перевірка відповідей сервера
`-v`, `--розгорнутий` Друкує повний запит та відповідь, включаючи заголовки Налагодження невдалого POST-запиту

Розуміння POST-запиту та методу HTTP curl

POST-запит curl — це HTTP-запит POST, що надсилається за допомогою методу POST та запускається з командного рядка. Сам інструмент curl описує свою роботу як «передача даних» через понад два десятки протоколів, одним з яких є HTTP. POST означає: ось деякі дані, зробіть щось з ними. Корисне навантаження розміщується в тілі запиту, а не в URL-адресі. Саме тому POST обробляє створення ресурсів, надсилання форм та все, що містить облікові дані. GET зберігає дані в рядку запиту, видимому для кожного проксі-сервера та кожної історії браузера. POST цього не робить.

У більшості посібників пропускається невелика, але корисна деталь. Передайте `-d` та curl автоматично перемикається на POST. Явний `-X POST`, який вказує на користувацький метод запиту для використання, є необов'язковим. Багато прикладів все ще містять його, оскільки прочитання `-X POST` поруч із корисним навантаженням робить намір очевидним з першого погляду.

PUT та POST плутають досить часто, тому варто уточнити. PUT замінює ресурс у відомому місці. POST створює новий або надсилає дані для обробки в загальній кінцевій точці.

POST-запит із curl

Базовий синтаксис curl POST та прапорець -d на практиці

Мінімальний POST-запит на curl — це один рядок:

```

curl -d "ім'я_користувача=arya&вік=16" https://api.example.com/users

```

Ось і все. POST-запит, тіло запиту, закодоване у формі urlencoded, без зайвого клопоту. `-d` виконує потрійну функцію: він додає корисне навантаження в тіло запиту, перетворює метод запиту на POST та додає `Content-Type: application/x-www-form-urlencoded` як заголовок за замовчуванням. Зазвичай я вставляю трохи більш детальну форму, оскільки POST-намір краще читається під час перегляду коду:

```

curl -X POST -d "ім'я_користувача=arya&вік=16" https://api.example.com/users

```

Ті самі байти на дроті. Ті самі аргументи запиту. Використовуйте той, який ваша команда вважає легшим для сканування. Прапорець `-d` — це робоча конячка, яка використовується для надсилання даних на сервер з командного рядка, і він обробляє дев'яносто відсотків того, що розробник бекенду коли-небудь кидає в curl: виклики оболонки, тести вебхуків, цілі Makefile, кроки дій GitHub.

Три близьких родичі `-d`. `--data-binary` зберігає ваші байти цілими; звичайний `-d` видаляє символи нового рядка та спотворює бінарне навантаження. `--data-urlencode` percent-encodes для вас: `--data-urlencode "name=I am Daniel"` надходить як `name=I%20am%20Daniel`. `--data-raw` — це рятувальний вихід, коли значення починається з `@`, а curl не повинен читати файл. Кілька прапорців `-d` об'єднуються за допомогою `&`. Підходить для форм. Ніколи не для JSON.

І останнє: цитування. Одинарні лапки навколо корисного навантаження не дозволяють оболонці інтерпретувати `$` або зворотні скісну риску. Забудьте про них, і ви витратите 2 години ночі, запитуючи, чому половина ваших POST-даних відсутня.

Ці деталі важливі, оскільки сам curl є одним із найбільш тестованих HTTP-клієнтів на планеті. Ретроспектива Стенберга за грудень 2025 року нарахувала вісім релізів того року. Дев'ять CVE, всі з низьким або середнім рейтингом. 2179 активних тестових випадків, що на 232 більше, ніж дванадцятьма місяцями раніше. Реліз 8.11.1, грудень 2024 року, виправив CVE-2024-11053 (витік облікових даних netrc-and-redirect). Поточна стабільна версія станом на кінець квітня 2026 року — curl 8.20.0. Будь-хто, хто застряг нижче 7.82.0, все ще не має прапорця `--json` і повертається до старішого шаблону з трьома прапорцями.

Надсилання JSON-даних за допомогою curl з використанням --json або -H

JSON – це лінгва франка REST API у 2026 році. Два способи його POST за допомогою curl. Який з них використовувати, повністю залежить від версії curl, що встановлена на машині.

Класичний шаблон із трьома прапорцями, працює всюди, починаючи з CentOS 6:

```

curl -X POST \

-H "Тип вмісту: application/json" \

-d '{"title":"Tea","quantity":2}' \

https://api.example.com/orders

```

Сучасне скорочення, доступне з версії curl 7.82.0 (березень 2022 року):

```

curl --json '{"title":"Tea","quantity":2}' https://api.example.com/orders

```

Прапорець `--json` виконує три дії. Встановлює `Content-Type: application/json`. Встановлює `Accept: application/json`. Надсилає тіло. Він також створює: передаючи `--json` більше одного разу, корисні навантаження об'єднуються. Корисно під час передавання фрагментів JSON у кінцеву точку потоку.

Для корисних навантажень JSON, що зберігаються у файлі, додайте перед шляхом до файлу префікс `@`. Надсилання даних з файлу стає стандартним шаблоном, коли об'єкт JSON стає занадто великим для вставки, або коли він знаходиться в системі контролю версій, або коли його генерує інший скрипт:

```

curl -X POST -H "Тип вмісту: application/json" -d @order.json https://api.example.com/orders

curl --json @order.json https://api.example.com/orders

```

Другий шаблон зчитує дані з файлу з назвою `order.json` та надсилає їх з усіма правильними заголовками. Для великого або потенційно бінарного JSON-контенту `--data-binary @file.json` є безпечнішим варіантом. Він не видаляє символи нового рядка, не інтерпретує спеціальні символи та надсилає необроблені бінарні дані до кінцевої точки, яка очікує байти, а не поля форми. Третій шаблон зчитує дані зі stdin через `-d @-`. Зручно, коли вивід з іншої команди передається безпосередньо в curl POST.

У таблиці нижче показано чотири поширені форми JSON для однієї кінцевої точки:

Візерунок Команда Коли використовувати
Рядовий, класичний `-X POST -H "Тип вмісту: application/json" -d '{"k":"v"}'` Максимальна сумісність, будь-яка версія curl
Вбудований, сучасний `--json '{"k":"v"}'` curl 7.82.0 або новіша версія, найчистіший синтаксис
З файлу, безпечно `-X POST -H "..." -d @payload.json` Корисне навантаження зберігається в системі контролю версій
З файлу, безпечний для бінарних файлів `-X POST -H "..." --data-binary @payload.json` Великі файли, корисні навантаження з переносами рядків

Це мало більше значення, ніж раніше. Кожен великий постачальник LLM — OpenAI, Anthropic, Mistral, Google — відкриває свою API-документацію за допомогою прикладу POST curl, використовуючи саме таку форму. Трафік, керований штучним інтелектом, додав 73% до загального обсягу викликів API у 2024 році (Postman). curl тепер є канонічним посиланням на «як мені викликати цю кінцеву точку».

POST-запит із curl

Тип вмісту, заголовки та те, що передбачає curl

Більшість відповідей "415 Непідтримуваний тип медіа" зводяться до одного відсутнього заголовка. За допомогою `-d` curl непомітно позначає ваш запит `Content-Type: application/x-www-form-urlencoded`. Надішліть тіло JSON без `-H "Content-Type: application/json"` або `--json`, і ви отримаєте назад 415. Без попередження, лише відхилення.

Інші метадані також передаються разом з тілом: Content-Length, заголовок Authorization, X-Request-Id для трасування. Правильне отримання цих метаданих – це половина будь-якої інтеграції API. Сам об'єкт JSON – це найпростіша половина.

`-H` додає власні заголовки. Повторюйте за потреби. Назви заголовків не враховують регістр; значення не враховують. Найшвидший спосіб налагодження неправильно налаштованого POST: запустіть його з `-v` один раз, прочитайте рядок запиту, порівняйте з документацією API. У восьми випадках з десяти помилка виникає за лічені секунди.

Ще два зауваження. Content-Length автоматично встановлюється curl на основі розміру тіла; ви рідко змінюєте його. `Accept: application/json` вказує серверу відповідати у форматі JSON, а не HTML. Додайте ще один `-H` для цього або використовуйте `--json`, який разом встановлює Content-Type та Accept.

Завантаження даних форм та файлів за допомогою curl POST -F

Для даних форми у стилі HTML з файлами правильний прапорець — `-F`. Він створює запит `multipart/form-data`. Різний тип контенту, ніж той, що `-d` використовує за замовчуванням. Різна ментальна модель. У посібниках з одним абзацом ці два типи досить часто змішуються, що призводить до реальних помилок.

`-F` один раз на поле. Звичайне поле форми:

```

curl -F "ім'я=Арья" https://api.example.com/submit

```

Завантаження файлу:

```

curl -F "файл=@/шлях/до/зображення.png" https://api.example.com/upload

```

Префікс `@` вказує curl на необхідність зчитування файлу з диска та включення його вмісту до тіла запиту. curl автоматично визначає MIME-тип з імені файлу; за потреби його можна явно перевизначити:

```

curl -F "файл=@фото.png;тип=зображення/png" https://api.example.com/upload

```

Кілька прапорців `-F` об'єднують кілька полів або файлів в один запит:

```

curl -F "title=Відпустка" -F "[email protected]" -F "[email protected]" https://api.example.com/album

```

Для необробленого вмісту файлу без багаточастинної обгортки, що є поширеною потребою під час надсилання JSON-файлу або бінарного блобу до потокової кінцевої точки, використовуйте `--data-binary @file.bin`. Це надсилає байти файлу як тіло запиту дослівно, з будь-яким типом вмісту, який ви явно встановите.

Автентифікація в curl POST: базова, на носія, ключі API

Три форми автентифікації охоплюють майже кожен REST API у 2026 році. Базова автентифікація (ім'я користувача плюс пароль, закодовані в base64 у заголовку):

```

curl -u "мій_користувач:мій_пароль" -X POST -d "..." https://api.example.com/login

```

Токени-носії, що використовуються більшістю сучасних API, включаючи всі облікові дані, видані OAuth, базуються на спеціальному заголовку авторизації:

```

curl -H "Авторизація: Носій $TOKEN" --json '{"q":"hello"}' https://api.example.com/query

```

Ключі API зазвичай знаходяться в заголовку, специфічному для сервісу:

```

curl -H "X-API-Ключ: $PLISIO_KEY" --json @invoice.json https://api.plisio.net/api/v1/invoices/new

```

Облікові дані зі змінної середовища або менеджера секретів, які ніколи не вводяться вбудовано. Чому? У звіті GitGuardian «State of Secrets Sprawl 2025» було зафіксовано 23,8 мільйона нових секретів, що витікали до публічного GitHub протягом 2024 року. Це на 25% більше, ніж у 2023 році. Понад 90% з них залишалися дійсними через п'ять днів після розкриття. Вбудовані облікові дані в скриптах curl є основним джерелом цих витоків. У розділі «Безпека» нижче описано робочий процес.

Приклад реального curl POST: API платежів Plisio

Довідкова документація без реального прикладу є теорією. Наведений нижче пост створює рахунок-фактуру на оплату криптовалютою через REST API Plisio. Plisio стягує фіксовану комісію в розмірі 0,5%; оператори обробки карток зазвичай стягують 2-4%. Plisio підтримує понад тридцять криптовалют та постачає інтеграції для дев'ятнадцяти платформ електронної комерції.

Чому крипто API працюють як цілі для практики. Стейблкоїни перемістили приблизно 28 трильйонів доларів у реальному економічному обсязі протягом 2025 року. Chainalysis прогнозує зростання на рівні 133% CAGR з 2023 року. Ринок крипто-платіжних шлюзів коливався близько 2 мільярдів доларів у 2025 році, і знаходиться на шляху до 2,39 мільярда доларів у 2026 році (за даними The Business Research Company). BitPay, Coinbase Commerce, Plisio: оберіть будь-який. Першим кроком інтеграції з будь-яким сучасним шлюзом майже завжди є curl POST.

Мінімальний виклик для створення нового рахунку-фактури:

```

curl -X POST https://api.plisio.net/api/v1/invoices/new \

-H "Тип вмісту: application/json" \

-H "Авторизація: Носій $PLISIO_API_KEY"

-d '{

"source_currency": "USD",

"source_amount": 49.99,

"order_number": "INV-1042",

"currency": "BTC",

"email": "[email protected]",

"order_name": "Annual subscription"

}'

```

Успішний виклик повертає HTTP 201. Тіло відповіді – це об'єкт JSON: згенерований ідентифікатор рахунку-фактури, `invoice_url`, за яким клієнт сплачує, адреса гаманця призначення, позначка часу закінчення терміну дії. Передайте його через `jq`, щоб отримати потрібне поле:

```

... | jq '.data.invoice_url'

```

Ось і весь шаблон. Змініть кінцеву точку, змініть корисне навантаження, і форма безпосередньо переноситься на платіж BitPay, оформлення замовлення Coinbase Commerce або намір оплати Stripe. Прапорці не змінюються; змінюється лише JSON.

Налагодження POST-запиту curl: -v, --trace, errors

Невдалий POST-тест — це головоломка для налагодження. Повторна спроба наосліп — найгірший крок. Чотири опції в командному рядку охоплюють більшість того, що вам потрібно.

`-v` друкує рядок запиту, кожен заголовок запиту та статус відповіді. Це перший прапорець, до якого ви звертаєтесь. `--trace-ascii -` — це більший прапорець: він виводить всю розмову, включаючи тіло POST-запиту, на стандартний вивід. Використовуйте `curl -i`, щоб вбудувати заголовки відповіді над тілом запиту. А `-w "%{http_code}\n"` записує лише код статусу HTTP, що корисно під час написання скриптів для перевірок CI на відповідність API.

Щодо кодів стану, які ви бачитимете найчастіше. 400: сервер проаналізував ваш запит, але відхилив корисне навантаження. 401: відсутній або недійсний заголовок авторизації. 415: неправильний тип вмісту. 500: сервер зламався на вашому введенні. Кожен з них виключає певний шар, що дорівнює половині значення запуску `-v` під час першої невдачі.

Безпека curl POST: ключі API, секрети та витоки

Кожен посил пропускає цей розділ. Кожен інцидент після розбору згадує його. Грудень 2024: витік даних Міністерства фінансів США пов'язаний з витоком ключа API BeyondTrust. Саме такі облікові дані знаходяться в заголовках `-H "Authorization: Bearer ..." у продакшн-скриптах.

Захист не надто привабливий. Зчитуйте токени зі змінних середовища. Зберігайте їх у менеджері секретів, такому як AWS Secrets Manager, HashiCorp Vault або 1Password CLI. Залишайте пре-коміт-хук, що виконує `gitleaks` або `trufflehog`. Ротуйте будь-який токен, який коли-небудь існував в історії оболонки. Нічого з цього не є захопливим. Все це працює. Застосування цього до кожного POST-запиту curl, який ви надсилаєте, — це найважливіша звичка, яку бекенд-розробник може виробити у 2026 році.

Які-небудь питання?

Дві фігури. Багаточастинне завантаження (формат HTML-форми): `curl -F "file=@/path/to/file.png" https://api.example.com/upload`. Необроблений бінарний файл, без обгортки: `curl --data-binary @file.bin -H "Content-Type: application/octet-stream" https://api.example.com/raw`. `@` – це те, що змушує curl читати з диска.

curl 7.82.0 (березень 2022 р.) та новіші версії: `curl --json `{"key":"value"}` https://api.example.com`. У старіших версіях шаблон із трьома прапорцями: `curl -X POST -H "Content-Type: application/json" -d `{"key":"value"}` https://api.example.com`. JSON вже є у файлі? Додайте префікс `@`: `--json @payload.json` або `-d @payload.json`.

Я б не назвав жодний з них "кращим". Curl перемагає будь-де, де оболонка перевершує графічний інтерфейс: одноразові виклики, завдання неперевершеної інтеграції, все, до чого ви отримуєте доступ через SSH. Postman перемагає у збережених колекціях, паралельному розпізнаванні різниці та командних робочих процесах. Я тримаю обидва.

Відкрийте оболонку, вставте `curl -X POST -d "field=value" https://api.example.com/endpoint`, натисніть Enter. Кінцева точка хоче JSON? Додайте `-H "Content-Type: application/json"` або використовуйте `--json`, якщо ви використовуєте curl 7.82.0 або новішу версію. Вивід виводиться на stdout, готовий до `jq`.

GET, самостійно. POST запускається після того, як `-d`, `--data`, `--data-binary`, `--data-urlencode`, `-F` або `--json` входять до команди. Будь-що інше (PATCH, DELETE, PROPFIND) потребує `-X`, оскільки жоден з них не має прапорця "скорочення".

Те, що ви отримуєте від `curl -X POST` (або будь-якого прапора надсилання даних) у терміналі. Дієслово повідомляє серверу "візьми це та зроби щось". Я звертаюся до нього, щоб протестувати кінцеву точку REST, відтворити вебхук, який помер у prod, або викурити лямбда одразу після розгортання.

Ready to Get Started?

Create an account and start accepting payments – no contracts or KYC required. Or, contact us to design a custom package for your business.

Make first step

Always know what you pay

Integrated per-transaction pricing with no hidden fees

Start your integration

Set up Plisio swiftly in just 10 minutes.