curl: HTTP-запросы из командной строки

curl: HTTP-запросы из командной строки

Теоретические знания об HTTP мы разобрали. Теперь перейдём к инструментам, которые позволяют применить эти знания на практике. Первый и самый важный — curl. Это командная строка для отправки HTTP-запросов. Без неё не живёт ни один backend-разработчик.

Что такое curl

curl (Client URL) — утилита командной строки для отправки запросов по разным протоколам: HTTP, HTTPS, FTP, SFTP и десятку других. Появилась в 1997 году, написана на C, работает на всех ОС.

Минимальный запрос:

curl https://example.com

Эта команда выполняет DNS-разрешение, TCP-подключение, TLS-рукопожатие, HTTP GET-запрос и выводит тело ответа в stdout. Ты только что повторил всё, что браузер делает при открытии страницы — но в текстовом виде.

Базовые флаги, которые нужны каждый день

-v (verbose) — самый важный флаг. Показывает ВСЁ: заголовки запроса и ответа, IP-адрес, TLS-версию, сертификат:

curl -v https://example.com

# Вывод:
# * Connected to example.com (93.184.216.34) port 443
# * TLSv1.3, cipher TLS_AES_256_GCM_SHA384
# > GET / HTTP/1.1
# > Host: example.com
# > User-Agent: curl/8.0
# > 
# < HTTP/1.1 200 OK
# < Content-Type: text/html
# < Cache-Control: max-age=604800
# < 
# <html>...</html>

Строки > — запрос клиента, < — ответ сервера, * — техническая информация (DNS, TCP, TLS).

-I (head) — только заголовки ответа, без тела:

curl -I https://example.com

-H (header) — добавить заголовок к запросу:

curl -H "Authorization: Bearer eyJhbGci..." https://api.example.com/users

-X — явно указать HTTP-метод (curl по умолчанию GET, но для наглядности):

curl -X POST https://api.example.com/users -H "Content-Type: application/json" -d '{"name":"Иван"}'

Отправка данных: -d, -F, --data-raw

Для POST-запросов данные передаются через -d (или --data):

# JSON-тело
curl -X POST https://httpbin.org/post \
  -H "Content-Type: application/json" \
  -d '{"name": "Иван", "email": "ivan@example.com"}'

# URL-encoded форма
curl -X POST https://httpbin.org/post \
  -d "name=Иван" -d "email=ivan@example.com"

# Отправка файла
curl -X POST https://httpbin.org/post \
  -F "image=@/path/to/photo.jpg"

Если нужно отправить JSON из файла, а не строкой:

curl -X POST https://api.example.com/users \
  -H "Content-Type: application/json" \
  -d @user.json

Диагностика через curl

curl — главный инструмент диагностики проблем с API. Типичные сценарии:

Проверить TLS-сертификат:

curl -v https://api.example.com 2>&1 | grep -E 'subject:|issuer:|expire'

Проверить все редиректы (следовать Location):

curl -L -v https://short.link/abc

Измерить время запроса (тайминг каждого этапа):

curl -w "@curl-format.txt" -o /dev/null -s https://example.com

Где curl-format.txt:

    DNS lookup:  %{time_namelookup}s
    TCP connect: %{time_connect}s
    TLS handshake: %{time_appconnect}s
    TTFB:        %{time_starttransfer}s
    Total:       %{time_total}s

Результат в точности соответствует вкладке Network в DevTools, которую разберём в уроке 12-2.

Поменять DNS-сервер (обход кэша):

curl --dns-servers 8.8.8.8 https://example.com

curl vs Postman: когда что

curlPostman/Bruno
Всегда доступен (консоль)Нужно устанавливать
Легко скриптовать, bash-скриптыУдобный UI, кнопки
Делиться: одна строкаДелиться: коллекция JSON
Тестирование: быстро, одноразовоТестирование: сохранить, повторить, автотест

Обычно в работе используют оба: curl для быстрой проверки и скриптов, Postman/Bruno для коллекций запросов и документирования API.

Проверь себя

  1. Как посмотреть заголовки ответа через curl, не загружая тело?
  2. Что показывают строки > и < в verbose-выводе curl?
  3. Какой флаг curl нужен для отправки JSON-тела?
<details> <summary>Ответы</summary>
  1. curl -I URL — метод HEAD, сервер присылает только заголовки.
  2. > — данные, отправленные КЛИЕНТОМ (заголовки запроса). < — данные, отправленные СЕРВЕРОМ (заголовки и тело ответа).
  3. -H "Content-Type: application/json" для заголовка и -d '{"ключ":"значение"}' для тела. Без Content-Type сервер может не распознать JSON.
</details>

Что унести с урока

  • curl -v URL — самый важный флаг, показывает весь процесс запроса.
  • -d для POST-данных, -H для заголовков, -I для HEAD-запроса.
  • curl -w с format-файлом даёт тайминг каждого этапа (DNS, TCP, TLS, TTFB).
  • curl незаменим для скриптов и быстрой диагностики API.

В следующем уроке разберём, как анализировать сетевую активность через DevTools Network — читать waterfall, смотреть заголовки, измерять время загрузки.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике