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: когда что
| curl | Postman/Bruno |
|---|---|
| Всегда доступен (консоль) | Нужно устанавливать |
| Легко скриптовать, bash-скрипты | Удобный UI, кнопки |
| Делиться: одна строка | Делиться: коллекция JSON |
| Тестирование: быстро, одноразово | Тестирование: сохранить, повторить, автотест |
Обычно в работе используют оба: curl для быстрой проверки и скриптов, Postman/Bruno для коллекций запросов и документирования API.
Проверь себя
- Как посмотреть заголовки ответа через curl, не загружая тело?
- Что показывают строки
>и<в verbose-выводе curl? - Какой флаг curl нужен для отправки JSON-тела?
curl -I URL— метод HEAD, сервер присылает только заголовки.>— данные, отправленные КЛИЕНТОМ (заголовки запроса).<— данные, отправленные СЕРВЕРОМ (заголовки и тело ответа).-H "Content-Type: application/json"для заголовка и-d '{"ключ":"значение"}'для тела. Без Content-Type сервер может не распознать JSON.
Что унести с урока
curl -v URL— самый важный флаг, показывает весь процесс запроса.-dдля POST-данных,-Hдля заголовков,-Iдля HEAD-запроса.curl -wс format-файлом даёт тайминг каждого этапа (DNS, TCP, TLS, TTFB).- curl незаменим для скриптов и быстрой диагностики API.
В следующем уроке разберём, как анализировать сетевую активность через DevTools Network — читать waterfall, смотреть заголовки, измерять время загрузки.