Зачем изучать 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--requestHTTP-метод (GET, POST, PUT, DELETE)
-H--headerДобавить заголовок запроса
-d--dataДанные тела запроса
-v--verboseПоказать полные детали запроса/ответа
-s--silentСкрыть индикатор прогресса
-o--outputСохранить ответ в файл
-w--write-outПользовательский формат вывода
-L--locationСледовать перенаправлениям
-k--insecureПропустить проверку SSL
-u--userBasic auth (user:password)
-i--includeПоказать заголовки ответа
-I--headHEAD-запрос (только заголовки)

Отладка с 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'

Практическое упражнение

  1. CRUD-цикл с cURL: Создайте пост (POST), прочитайте его (GET), обновите (PUT), затем удалите (DELETE) используя JSONPlaceholder
  2. Отладьте запрос: Используйте -v для инспекции всех заголовков запроса к https://httpbin.org/get
  3. Замерьте производительность: Замерьте время 5 разных публичных API endpoint-ов и сравните время ответа используя -w
  4. Напишите скрипт health check: Создайте bash-скрипт, проверяющий 3 endpoint-а и сообщающий коды статуса
  5. Практика jq: Получите посты из JSONPlaceholder и извлеките только заголовки используя jq

Ключевые выводы

  • cURL универсален, скриптуем и доступен повсюду — обязательные знания для каждого QA-инженера
  • Освойте ключевые флаги: -X (метод), -H (заголовки), -d (данные), -v (отладка), -s (тихий режим), -o (вывод)
  • Используйте -w для замера производительности и -v для полной отладки запроса/ответа
  • cURL естественно интегрируется в shell-скрипты, CI/CD-пайплайны и автоматические проверки здоровья
  • Комбинируйте cURL с jq для мощной обработки JSON из командной строки