# curl - HTTP-клиент из терминала _Команды · LinuxLab Knowledge Base_ **TL;DR:** `curl` - universal CLI для HTTP/HTTPS/FTP/etc. Делает запросы, видит заголовки, сертификаты, тайминги. Главный инструмент дебага HTTP API. ## Базовые формы ```bash curl https://example.com # GET, тело в stdout curl -s https://api.example/users # -s: silent (без progress bar) curl -o out.html https://example.com # сохранить в файл curl -O https://example.com/file.tar.gz # сохранить с original-именем curl -X POST -d 'name=alice' https://... # POST с form-данными curl -X POST -H "Content-Type: application/json" -d '{"x":1}' https://... curl -X DELETE https://api.example/u/123 ``` ## Заголовки и аутентификация ```bash curl -H "Authorization: Bearer $TOKEN" https://api.example curl -u user:pass https://api.example # basic auth curl --cookie "session=abc" https://... curl -A "Mozilla/5.0" https://... # User-Agent ``` ## Дебаг-флаги ```bash curl -v https://example.com # verbose: видим request + response headers curl -I https://example.com # ТОЛЬКО headers (HEAD-запрос; быстрая проверка) curl --trace-ascii - https://example.com # дамп всех байт обмена curl -w "@curl-format.txt" -o /dev/null -s https://example.com # тайминги ``` Формат для `-w`: ``` time_namelookup: %{time_namelookup}s time_connect: %{time_connect}s time_appconnect: %{time_appconnect}s # TLS-handshake time_starttransfer: %{time_starttransfer}s # TTFB time_total: %{time_total}s ``` Видно где именно тормозит: [dns-resolution](/kb/dns-resolution.md) / TCP / [tls-handshake](/kb/tls-handshake.md) / сервер. ## TLS ```bash curl -k https://self-signed # пропустить проверку сертификата (НЕ для прода!) curl --cacert ca.pem https://... # доверять конкретному CA curl --cert client.pem --key client.key # mTLS curl --resolve example.com:443:1.2.3.4 https://example.com # подмена DNS ``` `--resolve` - золото для тестов: ходит к указанному IP, но шлёт корректный SNI/Host. Без правки `/etc/hosts`. ## Повторы и таймауты ```bash curl --max-time 10 https://... # общий timeout 10с curl --connect-timeout 5 https://... # только TCP-connect curl --retry 3 --retry-delay 2 https://... # auto-retry на сетевых ошибках ``` ## Pipe в jq ```bash curl -s https://api.github.com/repos/torvalds/linux | jq '.stargazers_count' ``` Стандартная связка для REST-дебага. ## Команды ```bash curl -I https://example.com ``` Только response headers - быстрая проверка статуса, редиректов, версии HTTP ```bash curl -v -o /dev/null -s https://example.com 2>&1 | grep -E '^[<>]' ``` Чистый дамп request/response headers (без тела) ```bash curl -X POST -H 'Content-Type: application/json' -d @body.json https://api.example ``` POST с JSON из файла (@filename = взять содержимое файла) ```bash curl --resolve api.test:443:127.0.0.1 https://api.test/health ``` Подменить DNS-резолв для теста, не трогая /etc/hosts ```bash curl -w '%{time_total}s\n' -o /dev/null -s https://example.com ``` Полное время запроса - для измерения latency ## См. также - [jq - запросы и трансформация JSON](/kb/cmd-jq.md) - [TLS handshake](/kb/tls-handshake.md) - [HTTP/1.1, HTTP/2, HTTP/3](/kb/http-protocol.md) - [HTTP/2 internals - binary framing, HPACK, stream multiplexing](/kb/http2-internals.md) - [WebSocket - bidirectional поверх HTTP](/kb/websocket.md)