Gymterview
junior

Как выполнять HTTP-запросы из командной строки с помощью curl и wget?

curl — универсальный инструмент командной строки для выполнения HTTP-запросов (и других протоколов). wget — специализированный инструмент для скачивания файлов. Для Java-разработчика curl — основной инструмент тестирования REST API без графических клиентов.

curl — базовые запросы

Пример
# GET-запрос
curl https://api.example.com/users

# Сохранить ответ в файл
curl -o response.json https://api.example.com/users

# Показать заголовки ответа
curl -I https://example.com                  # Только заголовки (HEAD)
curl -i https://example.com                  # Заголовки + тело

# Verbose (подробный вывод — полезно для отладки)
curl -v https://example.com

# Тихий режим (без прогресс-бара)
curl -s https://api.example.com/users

Разные HTTP-методы

Пример
# POST с JSON
curl -X POST https://api.example.com/users \
  -H "Content-Type: application/json" \
  -d '{"name": "John", "email": "john@example.com"}'

# PUT
curl -X PUT https://api.example.com/users/1 \
  -H "Content-Type: application/json" \
  -d '{"name": "Jane"}'

# DELETE
curl -X DELETE https://api.example.com/users/1

# PATCH
curl -X PATCH https://api.example.com/users/1 \
  -H "Content-Type: application/json" \
  -d '{"email": "new@example.com"}'

Заголовки и аутентификация

Пример
# Произвольные заголовки
curl -H "Authorization: Bearer eyJhbGciOi..." \
     -H "Accept: application/json" \
     https://api.example.com/data

# Basic Auth
curl -u username:password https://api.example.com/data

# Отправка данных формы
curl -X POST -d "username=admin&password=secret" https://example.com/login

# Загрузка файла (multipart form)
curl -F "file=@report.pdf" https://example.com/upload

Полезные флаги curl

Пример
curl -L https://example.com          # Следовать редиректам (-L = location)
curl -k https://self-signed.example  # Игнорировать ошибки сертификата
curl -w "%{http_code}" -s -o /dev/null https://example.com  # Только HTTP-код ответа
curl --connect-timeout 5 --max-time 30 https://example.com  # Таймауты
curl --retry 3 https://api.example.com/data                 # Повторные попытки

wget — скачивание файлов

Пример
wget https://example.com/file.zip              # Скачать файл
wget -O output.zip https://example.com/file.zip # Указать имя выходного файла
wget -b https://example.com/large-file.iso      # Скачать в фоне
wget -c https://example.com/large-file.iso      # Продолжить прерванную загрузку
wget -r -l 2 https://docs.example.com/          # Рекурсивное скачивание (зеркало сайта)
wget --user=admin --password=secret https://example.com/data  # С аутентификацией

Сравнение curl и wget

Характеристика curl wget
Протоколы HTTP, HTTPS, FTP, SCP, SFTP, LDAP и др. HTTP, HTTPS, FTP
REST API Полная поддержка (методы, заголовки) Только GET
Рекурсивное скачивание Нет Да (-r)
Возобновление загрузки -C - -c
Вывод В stdout по умолчанию В файл по умолчанию

Практические примеры для Java-разработчика

Пример
# Проверка health endpoint Spring Boot
curl -s http://localhost:8080/actuator/health | jq .

# Тестирование REST API
curl -s -X POST http://localhost:8080/api/users \
  -H "Content-Type: application/json" \
  -d '{"name":"Test","email":"test@test.com"}' | jq .

# Мониторинг: проверить код ответа
STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/actuator/health)
if [ "$STATUS" != "200" ]; then
    echo "Service is down! Status: $STATUS"
fi

На собеседовании: уверенное владение curl с различными HTTP-методами и заголовками — обязательный навык. Покажите, что можете быстро протестировать REST endpoint без Postman. Знание -s -o /dev/null -w "%{http_code}" для получения только кода ответа — отличный маркер практического опыта.