skip to content
Зміст

Більшість із вас знайомі з cURL’ом, але небагато знають про його можливості. Я, крім образного curl 192.168.1.1, сам нічим більше не користувався. Ще бувало, що використовував “Copy as cURL” з Chrome DevTools і навіть не вникав у полотно скопійованих параметрів. От і настав час розібратися детальніше.

Що таке cURL?

cURL (розшифровується як Client URL) - це програмне забезпечення, що надає бібліотеку libcurl та інструмент командного рядка curl.

Встановлення cURL

Ви можете викликати цю команду зі свого термінала, не думаючи про те, як її встановити, оскільки вона постачається передвстановленою на більшості операційних систем на базі Linux.

Для тих, у кого «курла» якимось випадком не виявилося:

macOS (Homebrew):

Terminal window
brew install curl

Linux (Ubuntu/Debian):

Terminal window
sudo apt install curl

Windows: доступна з коробки, починаючи з Windows 10 v1803. Якщо у вас версія нижча, то можете завантажити та встановити за посиланням.

Основні команди cURL

Запит сторінки

Якщо аргумент явно не передано, то команда curl викликає HTTP GET і відображає статичний вміст сторінки, аналогічно опції перегляду вихідної сторінки у браузері.

Terminal window
curl http://example.org

Завантаження файлів

Існує кілька варіантів завантаження та збереження файлів:

Завантажити файл під оригінальним ім’ям:

Terminal window
curl -o https://example.org/testfile.xx

Завантажити файл під власним ім’ям:

Terminal window
curl -o random_name.xx https://example.org/testfile.xx

Завантажити кілька файлів однією командою:

Terminal window
curl -o https://example.org/testfile.xx -o https://example.org/testfile2.xx

Отримання HTTP заголовків

Якщо вам цікаво дізнатися, які заголовки включені на сервері, ви можете скористатися опцією -I. Вона дозволяє отримувати з сервера тільки заголовки документа.

Terminal window
curl -I http://example.org

Приклад відповіді:

HTTP/2 200
accept-ranges: bytes
age: 597367
cache-control: max-age=604800
content-type: text/html; charset=UTF-8
date: Mon, 08 Jun 2020 13:02:28 GMT
etag: "3147526947"
expires: Mon, 15 Jun 2020 13:02:28 GMT
last-modified: Thu, 17 Oct 2019 07:18:26 GMT
server: ECS (dcb/7EA6)
x-cache: HIT
content-length: 1256

Ігнорування недійсних сертифікатів

Часто при тестуванні API на вашому тестовому сервері, у вас може бути самопідписаний або недійсний сертифікат. Кожне SSL з’єднання, яке робить curl, перевіряється за замовчуванням.

Для тестування без перевірки сертифіката:

Terminal window
curl -k http://example.org
# або
curl --insecure http://example.org

POST-запити

Іноді при тестуванні API необхідно відправити йому деякі параметри, особливо при виконанні POST-запиту.

Відправка даних у форматі “ключ-значення”:

Terminal window
curl --data "param1=test1&param2=test2" http://example.org
# або коротко
curl -d "param1=test1&param2=test2" http://example.org
Відправка JSON даних:
Terminal window
curl --data '{"параметр1": "test1", "параметр2": "test2"}' \
-H "Content-Type: application/json" \
http://example.org

JSON з правильними заголовками (рекомендований спосіб):

Terminal window
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-запиту:

Terminal window
# Оновити значення для param2 на test3
curl -X 'PUT' -d '{"param1":"test1","param2":"test3"}' \
http://example.org

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

Завантаження файлу за допомогою curl з опцією -F емулює заповнену форму, коли користувач натискає на кнопку відправки. Ця опція викликає curl (POST-дані) з використанням багатокомпонентних/форм-даних Content-Type.

Terminal window
curl -F @field_name=@path/to/local_file

Керування часом виконання

Деякі запити даного інструменту можуть виконуватися ледь не до нескінченності - це дійсно проблема.

Максимальний час виконання команди:

Terminal window
curl -m 60 example.org

Час очікування з’єднання:

Terminal window
curl --connect-timeout 60 example.org

Використання проксі

У часи віддаленої роботи ця команда як ніколи доречна! Використовуйте прапор -x для виконання підключення через проксі-сервер:

Terminal window
curl -x 192.168.1.1:8080 http://example.com

Цікаві практичні приклади

Отримати свою зовнішню IP-адресу

Terminal window
curl ifconfig.me
193.19.14.88%

Отримання випадкового числа

Використовуйте сервіс random.org для генерації випадкових чисел:

Terminal window
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 - діапазон чисел

Отримати погоду у вашому місті

Terminal window
curl http://wttr.in/dnipro
curl http://v2.wttr.in/dnipro

Curl Weather

Згенерувати QR-код

Terminal window
curl qrenco.de/qaband.com

Curl QR Code

Додаткові корисні опції

Детальна інформація про запит

Terminal window
# Показати детальну інформацію про з'єднання
curl -v http://example.org
# Ще більше деталей
curl --trace-ascii debug.txt http://example.org

Робота з cookies

Terminal window
# Зберегти cookies у файл
curl -c cookies.txt http://example.org
# Використати збережені cookies
curl -b cookies.txt http://example.org

Базова автентифікація

Terminal window
curl -u username:password http://example.org

Показати прогрес завантаження

Terminal window
curl -# -O http://example.org/file.zip

Сучасні приклади (2025)

JWT токени

Terminal window
# Отримання 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 запити - тренд останніх років

Terminal window
# Простий 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 тестування - повний набір

Terminal window
# GET з query параметрами
curl "https://api.example.com/users?page=1&limit=10&sort=name"
# POST з файлом JSON
curl -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

Terminal window
# Завантаження файлу (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 підтримка

Terminal window
# Примусове використання HTTP/2
curl --http2 https://api.example.com/data
# Перевірка, яка версія HTTP використовується
curl -w "HTTP Version: %{http_version}\n" -o /dev/null -s https://google.com

Тестування продуктивності та моніторинг

Terminal window
# Детальна статистика запиту
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)

Terminal window
# Підключення до WebSocket (потребує websocat або wscat)
# curl -N --http1.1 \
# -H "Connection: Upgrade" \
# -H "Upgrade: websocket" \
# https://api.example.com/websocket
# Server-Sent Events
curl -N -H "Accept: text/event-stream" \
https://api.example.com/events

Тестування безпеки

Terminal window
# Перевірка SSL сертифікату
curl -I --cert-status https://example.com
# Тестування з різними TLS версіями
curl --tlsv1.2 https://example.com
curl --tlsv1.3 https://example.com
# Тестування з власним CA сертифікатом
curl --cacert my-ca-cert.pem https://internal-api.company.com

Поширені помилки

Помилка: “SSL certificate problem”

Terminal window
# Проблема з сертифікатом (не використовуйте у продакшені)
curl -k https://self-signed-cert.example.com
# Правильне рішення - додати сертифікат
curl --cacert certificate.crt https://example.com

Помилка: “Could not resolve host”

Terminal window
# Перевірка DNS
curl -v https://example.com
# Використання конкретного DNS
curl --dns-servers 8.8.8.8 https://example.com

Помилка: “Connection timeout”

Terminal window
# Збільшення timeout
curl --connect-timeout 30 --max-time 300 https://slow-api.com
# Перевірка з verbose режимом
curl -v --trace-time https://slow-api.com

Проблеми з JSON парсингом

Terminal window
# Неправильно (може не працювати)
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-гуру!


Корисні посилання:

Обговорення
Вхід через GitHub
Завантаження коментарів...
Зміст