
HTTP-заголовки в cURL: как отправить и посмотреть
В cURL опция -H задаёт заголовок запроса, -i показывает заголовки ответа вместе с телом, -I отправляет HEAD. Для отладки запроса и ответа используйте -v, для сохранения заголовков в файл используйте -D.

Ниже приведены копируемые команды и объяснение результата. В Windows PowerShell запускайте curl.exe; в Linux и macOS используйте curl. Проверить утилиту можно командой curl --version. Учебному сервису httpbin отправляйте только демонстрационные данные.
Что такое HTTP-заголовки
Заголовок передаёт имя и значение, например Accept: application/json. Заголовки запроса описывают обращение клиента, заголовки ответа описывают результат сервера.
Accept сообщает желаемый формат ответа, Content-Type указывает формат передаваемого тела. Authorization передаёт учётные данные, например схему и токен. Эти поля выполняют разные задачи и не заменяют друг друга.
Как отправить один или несколько заголовков
Каждый -H добавляет или переопределяет заголовок. Заключайте имя и значение в обычные прямые кавычки:
curl --connect-timeout 5 --max-time 20 -H "Accept: application/json" -H "X-Demo: test" "https://httpbin.org/headers"
В JSON-ответе найдите headers: в нём должны появиться отправленные Accept и X-Demo. Сервис или промежуточный узел может изменить регистр отображаемого имени.
Для нескольких заголовков повторяйте -H. Не объединяйте разные поля в одну строку через запятую: это меняет значение одного поля. Повторение поля с одинаковым именем также зависит от его правил; для обычного одиночного заголовка задавайте одно значение.
Метод GET используется по умолчанию. Если передаёте тело через --data-binary, cURL по умолчанию отправит POST. Дополнительные команды GET с параметрами описаны в руководстве по GET-запросам cURL.
Как удалить заголовок или отправить пустое значение
В cURL двоеточие и точка с запятой в конце аргумента -H означают разные действия.
Удалить автоматически добавляемый заголовок:
curl -H "User-Agent:" "https://httpbin.org/headers"
Отправить заголовок с пустым значением:
curl -H "X-Demo;" "https://httpbin.org/headers"
Во второй команде -H "X-Demo;" заставляет cURL отправить поле X-Demo: с пустым значением. В первой команде -H "User-Agent:" подавляет стандартный User-Agent. Прокси или сервер может удалить пустое поле, поэтому при необходимости проверьте исходящий запрос через -v.
Не добавляйте перевод строки внутрь заголовка. Один аргумент -H задаёт одну строку заголовка.
Как посмотреть заголовки запроса и ответа
| Опция | Что делает | Метод запроса |
|---|---|---|
-i |
Печатает заголовки ответа перед телом | Сохраняет выбранный метод |
-I |
Запрашивает заголовки без тела | Отправляет HEAD |
-D headers.txt |
Записывает заголовки ответа в файл | Сохраняет выбранный метод |
-v |
Показывает диагностику и обмен заголовками | Сохраняет выбранный метод |

Заголовки вместе с телом
curl -i "https://httpbin.org/get"
Сначала появится HTTP-статус и заголовки, после пустой строки будет тело. Если требуется только тело JSON, уберите -i перед передачей вывода JSON-парсеру.
Заголовки GET-ответа в файл через -D
curl -D headers.txt -o body.json "https://httpbin.org/get"
Откройте headers.txt для проверки заголовков и body.json для проверки тела. Это сохраняет GET. Опция -I меняет метод на HEAD, поэтому сервер может ответить иначе или не поддерживать запрос.
Исходящий запрос через -v
curl -v --stderr debug.log -H "X-Demo: test" "https://httpbin.org/get"
Диагностика направляется в debug.log через --stderr; тело ответа остаётся в stdout. Этот способ подходит и для PowerShell. В обычном текстовом выводе строки с > относятся к запросу, строки с < относятся к ответу, строки с * описывают соединение. Секреты в диагностике удалите перед публикацией журнала.
JSON, авторизация и условные запросы
Content-Type и Accept
Создайте файл payload.json с демонстрационным содержимым. Сохраните его в UTF-8 без BOM, например в редакторе кода:
{"name": "demo"}
Отправьте его как JSON:
curl -H "Content-Type: application/json" -H "Accept: application/json" --data-binary "@payload.json" "https://httpbin.org/post"
Поле json в ответе должно содержать объект с name. Content-Type относится к отправленному телу. Accept сообщает предпочтение для ответа, но конечный формат выбирает сервер.
Authorization
Учебная проверка Bearer-заголовка:
curl -H "Authorization: Bearer demo-token" "https://httpbin.org/bearer"
httpbin вернёт признак получения токена. На рабочем API используйте его механизм выдачи токенов и защищённое хранение. Передача заголовка сама по себе не добавляет прав доступа. Способы авторизации отдельно разобраны в руководстве по аутентификации cURL.
Условные запросы
После первого ответа сохраните значение ETag, если сервер его прислал. Следующему GET передайте это значение в If-None-Match. Совпадение версии может дать HTTP 304 без тела.
Файл заголовков, редиректы и прокси
Заголовки из файла
Создайте headers.txt, по одному заголовку на строку:
Accept: application/json
X-Demo: test
Передайте файл cURL:
curl -H "@headers.txt" "https://httpbin.org/headers"
Если файл содержит секреты, ограничьте доступ к нему и исключите из репозитория. Файл упрощает повтор команды, но не шифрует значения.
Заголовки при редиректе
-L включает переходы, --max-redirs 5 ограничивает их число. Просматривайте цепочку через -D или -v. Некоторые пользовательские заголовки, например X-API-Key, могут уйти следующему хосту. Прежде чем добавлять -L к запросу с секретными заголовками, проверьте, куда ведёт редирект.
cURL по умолчанию ограничивает передачу Authorization и Cookie на другой origin. Не добавляйте --location-trusted для устранения ошибки доступа без понимания, куда будут переданы учётные данные.
Заголовки для сайта и для прокси
-H задаёт заголовки целевого HTTP-запроса. Для дополнительных заголовков HTTP-прокси предусмотрена --proxy-header; авторизацию прокси обычно задают через --proxy-user. Эти параметры отличаются от Authorization целевого API.
Для отдельного выходного IP выберите индивидуальные прокси ProxyWing. Подставьте адрес, порт и учётные данные из параметров подключения. Контрольный GET через HTTP-прокси приведён в разделе о GET-запросах cURL.
Почему заголовок не сработал
- Проверьте, что в команде используется
-Hс обычным дефисом и прямыми кавычками. Типографские кавычки из редактора командная оболочка может прочитать как часть значения. - Просмотрите отправленное поле через
-v. Затем проверьте заголовки ответа через-iили-D. - Сверьте назначение поля с API.
Content-Typeне просит сервер вернуть JSON; для этого служитAccept. - При 401 проверьте токен, при 403 проверьте права и причину запрета, при 407 проверьте авторизацию прокси.
- При 415 сверяйте Content-Type с фактическим телом. При 406 проверьте допустимые форматы ответа.
Имена HTTP-заголовков нечувствительны к регистру. Значения могут зависеть от регистра. Запись заголовка маленькими буквами при HTTP/2 нормальна и сама по себе не означает ошибку.
Не вычисляйте Content-Length вручную для обычных запросов: cURL знает размер подготовленного тела. Некорректное значение может нарушить передачу.
Короткая памятка команд
curl -H "X-Demo: test" "https://httpbin.org/headers"
curl -i "https://httpbin.org/get"
curl -I "https://example.com"
curl -D response-headers.txt -o response-body.txt "https://example.com"
curl -H "User-Agent:" "https://httpbin.org/headers"
curl -H "X-Demo;" "https://httpbin.org/headers"
Последние две команды специально различаются: первая удаляет стандартный заголовок, вторая отправляет пользовательское поле с пустым значением. Для автоматизированного запуска добавьте --connect-timeout 10 и --max-time 30.
Проверка перед сохранением команды
Убедитесь, что исходящий заголовок содержит ожидаемое значение, сервер принял метод и формат тела, а секреты не попали в журнал. Сохраните отдельно тело и заголовки ответа, если их будут читать другие инструменты. Для JSON-парсера нужен чистый JSON без добавленного блока HTTP-заголовков.
Статью написал:
Фулстек AI-инженер
Александр привносит в инженерную команду Proxywing глубокую фулстек-экспертизу — от архитектуры бэкенда и оптимизации производительности до AI-ориентированных процессов разработки. Его практический опыт охватывает Node.js, React, облачную инфраструктуру и RAG-пайплайны, что позволяет одинаково уверенно работать как с внутренней логикой прокси-платформы, так и с пользовательской частью продукта. В Proxywing Александр сосредоточен на проектировании отказоустойчивых систем, устранении узких мест производительности и внедрении современных AI-инструментов в процесс разработки. Вне кода он увлечён исследованием передовых подходов в AI-инженерии и созданием сайд-проектов, расширяющих технические горизонты.
Все статьи автора (58)

