Зачем изучать cURL?
cURL (Client URL) — инструмент командной строки для передачи данных по различным протоколам. Он предустановлен на macOS и большинстве дистрибутивов Linux, доступен для Windows. Каждый QA-инженер должен знать cURL, потому что:
- Он универсален — доступен на каждом сервере, контейнере и CI/CD-раннере
- Он скриптуемый — легко интегрируется в shell-скрипты и пайплайны
- Это lingua franca — документация API часто предоставляет примеры на cURL
- Не требует установки — в отличие от Postman, он уже на вашей машине
- Он точен — вы контролируете каждый аспект запроса
Проверка установки
curl --version
# curl 8.7.1 (x86_64-apple-darwin23.0) ...
Базовые команды cURL
GET-запрос
# Простой GET
curl https://jsonplaceholder.typicode.com/posts/1
# GET с заголовками
curl -H "Accept: application/json" \
-H "Authorization: Bearer token123" \
https://api.example.com/users
POST-запрос
# POST с JSON-телом
curl -X POST \
-H "Content-Type: application/json" \
-d '{"title": "Новый пост", "body": "Контент", "userId": 1}' \
https://jsonplaceholder.typicode.com/posts
# POST с form data
curl -X POST \
-d "username=admin&password=secret" \
https://api.example.com/login
PUT и PATCH
# PUT — замена ресурса целиком
curl -X PUT \
-H "Content-Type: application/json" \
-d '{"title": "Обновлено", "body": "Новый контент", "userId": 1}' \
https://jsonplaceholder.typicode.com/posts/1
# PATCH — частичное обновление
curl -X PATCH \
-H "Content-Type: application/json" \
-d '{"title": "Только заголовок изменён"}' \
https://jsonplaceholder.typicode.com/posts/1
DELETE
curl -X DELETE https://jsonplaceholder.typicode.com/posts/1
Основные флаги cURL
| Флаг | Полная форма | Назначение |
|---|---|---|
-X | --request | HTTP-метод (GET, POST, PUT, DELETE) |
-H | --header | Добавить заголовок запроса |
-d | --data | Данные тела запроса |
-v | --verbose | Показать полные детали запроса/ответа |
-s | --silent | Скрыть индикатор прогресса |
-o | --output | Сохранить ответ в файл |
-w | --write-out | Пользовательский формат вывода |
-L | --location | Следовать перенаправлениям |
-k | --insecure | Пропустить проверку SSL |
-u | --user | Basic auth (user:password) |
-i | --include | Показать заголовки ответа |
-I | --head | HEAD-запрос (только заголовки) |
Отладка с cURL
Подробный вывод (verbose)
Флаг -v — ваш лучший друг для отладки:
curl -v https://jsonplaceholder.typicode.com/posts/1
Вывод показывает:
>— отправленные заголовки запроса<— полученные заголовки ответа*— информация о соединении и SSL-детали
Только заголовки ответа
# Показать заголовки вместе с телом
curl -i https://jsonplaceholder.typicode.com/posts/1
# Показать только заголовки (HEAD-запрос)
curl -I https://jsonplaceholder.typicode.com/posts
Замер времени запросов
curl -w "\nHTTP-код: %{http_code}\nОбщее время: %{time_total}с\nDNS: %{time_namelookup}с\nСоединение: %{time_connect}с\nTTFB: %{time_starttransfer}с\n" \
-s -o /dev/null \
https://jsonplaceholder.typicode.com/posts
Показывает метрики производительности без тела ответа.
Аутентификация с cURL
API Key
# В заголовке
curl -H "X-API-Key: ваш-api-key" https://api.example.com/data
# Как query-параметр
curl "https://api.example.com/data?api_key=ваш-api-key"
Basic Auth
curl -u username:password https://api.example.com/users
# Эквивалентно: -H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ="
Bearer Token (JWT/OAuth)
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..." \
https://api.example.com/protected
Продвинутые техники
Отправка файлов
# Загрузка файла
curl -X POST \
-F "file=@photo.jpg" \
-F "description=Фото профиля" \
https://api.example.com/upload
# Отправить JSON из файла
curl -X POST \
-H "Content-Type: application/json" \
-d @payload.json \
https://api.example.com/users
Сохранение ответов
# Сохранить в файл
curl -o response.json https://api.example.com/data
# Сохранить только при успехе
curl -f -o response.json https://api.example.com/data
Скриптинг с cURL
#!/bin/bash
# Простой скрипт проверки здоровья API
BASE_URL="https://api.example.com"
ENDPOINTS=("/health" "/users" "/posts")
for endpoint in "${ENDPOINTS[@]}"; do
status=$(curl -s -o /dev/null -w "%{http_code}" "$BASE_URL$endpoint")
if [ "$status" -eq 200 ]; then
echo "OK: $endpoint ($status)"
else
echo "ОШИБКА: $endpoint ($status)"
fi
done
Конвертация между cURL и Postman
Postman в cURL: Нажмите иконку </> Code в Postman и выберите cURL.
cURL в Postman: Нажмите Import в Postman, вставьте команду cURL, и Postman построит запрос.
Использование jq для обработки JSON
# Форматированный вывод JSON
curl -s https://jsonplaceholder.typicode.com/posts | jq '.'
# Извлечь конкретное поле
curl -s https://jsonplaceholder.typicode.com/posts/1 | jq '.title'
# Фильтровать массив
curl -s https://jsonplaceholder.typicode.com/posts | jq '.[0:3] | .[].title'
Практическое упражнение
- CRUD-цикл с cURL: Создайте пост (POST), прочитайте его (GET), обновите (PUT), затем удалите (DELETE) используя JSONPlaceholder
- Отладьте запрос: Используйте
-vдля инспекции всех заголовков запроса кhttps://httpbin.org/get - Замерьте производительность: Замерьте время 5 разных публичных API endpoint-ов и сравните время ответа используя
-w - Напишите скрипт health check: Создайте bash-скрипт, проверяющий 3 endpoint-а и сообщающий коды статуса
- Практика jq: Получите посты из JSONPlaceholder и извлеките только заголовки используя jq
Ключевые выводы
- cURL универсален, скриптуем и доступен повсюду — обязательные знания для каждого QA-инженера
- Освойте ключевые флаги:
-X(метод),-H(заголовки),-d(данные),-v(отладка),-s(тихий режим),-o(вывод) - Используйте
-wдля замера производительности и-vдля полной отладки запроса/ответа - cURL естественно интегрируется в shell-скрипты, CI/CD-пайплайны и автоматические проверки здоровья
- Комбинируйте cURL с jq для мощной обработки JSON из командной строки