Більшість із вас знайомі з cURL’ом, але небагато знають про його можливості. Я, крім образного curl 192.168.1.1, сам нічим більше не користувався. Ще бувало, що використовував “Copy as cURL” з Chrome DevTools і навіть не вникав у полотно скопійованих параметрів. От і настав час розібратися детальніше.
Що таке cURL?
cURL (розшифровується як Client URL) - це програмне забезпечення, що надає бібліотеку libcurl та інструмент командного рядка curl.
Встановлення cURL
Ви можете викликати цю команду зі свого термінала, не думаючи про те, як її встановити, оскільки вона постачається передвстановленою на більшості операційних систем на базі Linux.
Для тих, у кого «курла» якимось випадком не виявилося:
macOS (Homebrew):
brew install curlLinux (Ubuntu/Debian):
sudo apt install curlWindows: доступна з коробки, починаючи з 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.orgPOST-запити
Іноді при тестуванні 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.orgJSON з правильними заголовками (рекомендований спосіб):
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-resourceGraphQL запити - тренд останніх років
# Простий 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/graphqlREST 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-uploadHTTP/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-гуру!
Корисні посилання: