Більшість із вас знайомі з cURL’ом, але небагато знають про його можливості. Я, крім образного curl 192.168.1.1, сам нічим більше не користувався. Ще бувало, що використовував “Copy as cURL” з Chrome DevTools і навіть не вникав у полотно скопійованих параметрів. От і настав час розібратися детальніше.
Що таке cURL?
cURL (розшифровується як Client URL) - це програмне забезпечення, що надає бібліотеку libcurl та інструмент командного рядка curl.
Встановлення cURL
Ви можете викликати цю команду зі свого термінала, не думаючи про те, як її встановити, оскільки вона постачається передвстановленою на більшості операційних систем на базі Linux.
Для тих, у кого «курла» якимось випадком не виявилося:
macOS (Homebrew):
brew install curl
Linux (Ubuntu/Debian):
sudo apt install curl
Windows: доступна з коробки, починаючи з Windows 10 v1803. Якщо у вас версія нижча, то можете завантажити та встановити за посиланням.
Основні команди cURL
Запит сторінки
Якщо аргумент явно не передано, то команда curl викликає HTTP GET і відображає статичний вміст сторінки, аналогічно опції перегляду вихідної сторінки у браузері.
curl http://example.org
Завантаження файлів
Існує кілька варіантів завантаження та збереження файлів:
Завантажити файл під оригінальним ім’ям:
curl -o https://example.org/testfile.xx
Завантажити файл під власним ім’ям:
curl -o random_name.xx https://example.org/testfile.xx
Завантажити кілька файлів однією командою:
curl -o https://example.org/testfile.xx -o https://example.org/testfile2.xx
Отримання HTTP заголовків
Якщо вам цікаво дізнатися, які заголовки включені на сервері, ви можете скористатися опцією -I. Вона дозволяє отримувати з сервера тільки заголовки документа.
curl -I http://example.org
Приклад відповіді:
HTTP/2 200accept-ranges: bytesage: 597367cache-control: max-age=604800content-type: text/html; charset=UTF-8date: Mon, 08 Jun 2020 13:02:28 GMTetag: "3147526947"expires: Mon, 15 Jun 2020 13:02:28 GMTlast-modified: Thu, 17 Oct 2019 07:18:26 GMTserver: ECS (dcb/7EA6)x-cache: HITcontent-length: 1256
Ігнорування недійсних сертифікатів
Часто при тестуванні API на вашому тестовому сервері, у вас може бути самопідписаний або недійсний сертифікат. Кожне SSL з’єднання, яке робить curl, перевіряється за замовчуванням.
Для тестування без перевірки сертифіката:
curl -k http://example.org# абоcurl --insecure http://example.org
POST-запити
Іноді при тестуванні API необхідно відправити йому деякі параметри, особливо при виконанні POST-запиту.
Відправка даних у форматі “ключ-значення”:
curl --data "param1=test1¶m2=test2" http://example.org# або короткоcurl -d "param1=test1¶m2=test2" http://example.org
Відправка JSON даних:
curl --data '{"параметр1": "test1", "параметр2": "test2"}' \ -H "Content-Type: application/json" \ http://example.org
JSON з правильними заголовками (рекомендований спосіб):
curl -X POST \ -H "Content-Type: application/json" \ -d '{"name": "User", "role": "QA"}' \ https://api.example.com/users
Задаємо метод запиту
За замовчуванням curl робить GET запит HTTP, якщо тільки на нього не передаються якісь дані. Якщо ви хочете просто оновити запис, а не відтворити, curl має опцію, яка стане у нагоді вам у цьому випадку.
Опція -X або —request дозволяє вказати метод HTTP-запиту:
# Оновити значення для param2 на test3curl -X 'PUT' -d '{"param1":"test1","param2":"test3"}' \http://example.org
Завантаження файлу на сервер
Завантаження файлу за допомогою curl з опцією -F емулює заповнену форму, коли користувач натискає на кнопку відправки. Ця опція викликає curl (POST-дані) з використанням багатокомпонентних/форм-даних Content-Type.
curl -F @field_name=@path/to/local_file
Керування часом виконання
Деякі запити даного інструменту можуть виконуватися ледь не до нескінченності - це дійсно проблема.
Максимальний час виконання команди:
curl -m 60 example.org
Час очікування з’єднання:
curl --connect-timeout 60 example.org
Використання проксі
У часи віддаленої роботи ця команда як ніколи доречна! Використовуйте прапор -x для виконання підключення через проксі-сервер:
curl -x 192.168.1.1:8080 http://example.com
Цікаві практичні приклади
Отримати свою зовнішню IP-адресу
curl ifconfig.me193.19.14.88%
Отримання випадкового числа
Використовуйте сервіс random.org для генерації випадкових чисел:
curl "https://www.random.org/integers/?num=1&min=1&max=99999&col=1&base=10&format=plain&rnd=new"81383
,де : min=1&max=99999
- діапазон чисел
Отримати погоду у вашому місті
curl http://wttr.in/dniprocurl http://v2.wttr.in/dnipro
Згенерувати QR-код
curl qrenco.de/qaband.com
Додаткові корисні опції
Детальна інформація про запит
# Показати детальну інформацію про з'єднанняcurl -v http://example.org
# Ще більше деталейcurl --trace-ascii debug.txt http://example.org
Робота з cookies
# Зберегти cookies у файлcurl -c cookies.txt http://example.org
# Використати збережені cookiescurl -b cookies.txt http://example.org
Базова автентифікація
curl -u username:password http://example.org
Показати прогрес завантаження
curl -# -O http://example.org/file.zip
Сучасні приклади (2025)
JWT токени
# Отримання JWT токенуcurl -X POST \ -H "Content-Type: application/json" \ -d '{"username": "admin", "password": "secure123"}' \ https://api.example.com/auth/login
# Використання JWT токену в заголовкуcurl -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..." \ https://api.example.com/protected-resource
GraphQL запити - тренд останніх років
# Простий GraphQL запитcurl -X POST \ -H "Content-Type: application/json" \ -d '{"query":"query { user(id: 123) { name email posts { title } } }"}' \ https://api.example.com/graphql
# GraphQL зі зміннимиcurl -X POST \ -H "Content-Type: application/json" \ -d '{"query":"query($userId: ID!) { user(id: $userId) { name email } }", "variables":{"userId":"123"}}' \ https://api.example.com/graphql
REST API тестування - повний набір
# GET з query параметрамиcurl "https://api.example.com/users?page=1&limit=10&sort=name"
# POST з файлом JSONcurl -X POST \ -H "Content-Type: application/json" \ -d @user-data.json \ https://api.example.com/users
# PUT для оновленняcurl -X PUT \ -H "Content-Type: application/json" \ -d '{"name": "updated_name", "email": "new@example.com"}' \ https://api.example.com/users/123
# DELETE для видаленняcurl -X DELETE \ -H "Authorization: Bearer your-token-here" \ https://api.example.com/users/123
Робота з файлами та multipart/form-data
# Завантаження файлу (multipart)curl -X POST \ -F "file=@screenshot.png" \ -F "title=my_screenshot" \ -F "description=Скріншот баги" \ https://api.example.com/upload
# Завантаження JSON + файлcurl -X POST \ -F "data={\"name\":\"test\"};type=application/json" \ -F "file=@test.jpg" \ https://api.example.com/mixed-upload
HTTP/2 та HTTP/3 підтримка
# Примусове використання HTTP/2curl --http2 https://api.example.com/data
# Перевірка, яка версія HTTP використовуєтьсяcurl -w "HTTP Version: %{http_version}\n" -o /dev/null -s https://google.com
Тестування продуктивності та моніторинг
# Детальна статистика запитуcurl -w "DNS lookup: %{time_namelookup}s\nConnect: %{time_connect}s\nTLS handshake: %{time_appconnect}s\nTotal time: %{time_total}s\nHTTP code: %{http_code}\n" \ -o /dev/null -s https://api.example.com
# Тестування швидкості завантаженняcurl -w "Speed: %{speed_download} bytes/sec\nSize: %{size_download} bytes\n" \ -o /dev/null https://example.com/large-file.zip
# Перевірка доступності сервісуcurl -f -s -o /dev/null https://api.example.com/health || echo "Service unavailable"
WebSocket та SSE (Server-Sent Events)
# Підключення до WebSocket (потребує websocat або wscat)# curl -N --http1.1 \# -H "Connection: Upgrade" \# -H "Upgrade: websocket" \# https://api.example.com/websocket
# Server-Sent Eventscurl -N -H "Accept: text/event-stream" \ https://api.example.com/events
Тестування безпеки
# Перевірка SSL сертифікатуcurl -I --cert-status https://example.com
# Тестування з різними TLS версіямиcurl --tlsv1.2 https://example.comcurl --tlsv1.3 https://example.com
# Тестування з власним CA сертифікатомcurl --cacert my-ca-cert.pem https://internal-api.company.com
Поширені помилки
Помилка: “SSL certificate problem”
# Проблема з сертифікатом (не використовуйте у продакшені)curl -k https://self-signed-cert.example.com
# Правильне рішення - додати сертифікатcurl --cacert certificate.crt https://example.com
Помилка: “Could not resolve host”
# Перевірка DNScurl -v https://example.com
# Використання конкретного DNScurl --dns-servers 8.8.8.8 https://example.com
Помилка: “Connection timeout”
# Збільшення timeoutcurl --connect-timeout 30 --max-time 300 https://slow-api.com
# Перевірка з verbose режимомcurl -v --trace-time https://slow-api.com
Проблеми з JSON парсингом
# Неправильно (може не працювати)curl -d "{'name': 'test'}" https://api.example.com
# Правильноcurl -H "Content-Type: application/json" -d '{"name": "test"}' https://api.example.com
# Або з файлуcurl -H "Content-Type: application/json" -d @data.json https://api.example.com
Висновок
Ми розглянули як базові, так і сучасні команди cURL. Цей інструмент надзвичайно потужний і постійно розвивається разом з веб-технологіями.
Ключові переваги cURL:
- ✅ Універсальність - підтримка багатьох протоколів
- ✅ Гнучкість - безліч опцій для налаштування
- ✅ Автоматизація - можливість використання у скриптах
- ✅ Тестування - ідеальний для тестування API
- ✅ Крос-платформенність - працює на всіх ОС
- ✅ Сучасність - підтримка HTTP/2, HTTP/3, GraphQL
Що нового у 2025?
- JWT автентифікація - стандарт для сучасних API
- GraphQL - нова ера запитів до API
- Детальний моніторинг - вбудовані метрики продуктивності
- Покращена безпека - сучасні TLS версії та сертифікати
Наступні кроки:
Найкращий спосіб вивчити cURL - це експериментувати з різними параметрами та тестувати реальні API. Починайте з простих GET запитів, поступово переходьте до складних сценаріїв з JWT та GraphQL.
Сподіваюся, ці команди зроблять вас справжнім cURL-гуру!
Корисні посилання: