HTTP-запрос и HTTP-ответ: структура, методы, заголовки и коды

Запросы HTTP протокола — это сообщения, с помощью которых браузер, мобильное приложение или другая программа обращается к серверу. Сервер принимает запрос, анализирует его метод, URL, заголовки и тело, а затем возвращает ответ со статусом, заголовками и данными. Понимание этой последовательности помогает разбираться в работе сайтов, API, авторизации, загрузке файлов и причинах ошибок вроде 404 или 500.

HTTP-сообщение — это не абстрактная команда, а вполне конкретный текстовый или бинарный обмен: клиент сообщает, что ему нужно, а сервер отвечает, удалось ли выполнить операцию и какие данные следует вернуть.

Ниже последовательно разберём, как устроены сообщения протокола HTTP, чем запрос отличается от ответа, зачем нужны методы и заголовки, как читать коды состояния и где именно передаются параметры. Отдельное внимание уделим практическим примерам для сайта cio-navigator.ru, чтобы теория не оставалась набором непонятных терминов.

Содержание
  1. Иерархия знаний по HTTP
  2. Что такое HTTP-запрос и HTTP-ответ
  3. Как клиент отправляет HTTP-запрос
  4. Как сервер формирует HTTP-ответ
  5. Связь между запросом и ответом
  6. Структура HTTP-запроса
  7. Стартовая строка запроса
  8. Заголовки HTTP-запроса
  9. Тело HTTP-запроса
  10. URL и параметры запроса
  11. Query-параметры
  12. Данные в теле запроса
  13. Структура HTTP-ответа
  14. Строка состояния
  15. Заголовки ответа
  16. Тело HTTP-ответа
  17. Методы HTTP-запросов — Таблица
  18. GET
  19. POST
  20. PUT
  21. PATCH
  22. DELETE
  23. HEAD
  24. OPTIONS
  25. Заголовки HTTP
  26. Что такое HTTP-заголовки
  27. Заголовки запроса
  28. Заголовки ответа
  29. Content-Type
  30. Content-Length
  31. Authorization
  32. Accept
  33. User-Agent
  34. Коды состояния HTTP — Таблица
  35. Коды 1xx
  36. Коды 2xx
  37. Коды 3xx
  38. Коды 4xx
  39. Коды 5xx
  40. Как выглядит HTTP-запрос — Пример
  41. Как выглядит HTTP-ответ — Пример
  42. HTTP GET и POST — сравнение — Таблица
  43. Типичные ошибки HTTP
  44. Ошибки 400 и 401
  45. Ошибки 403 и 404
  46. Ошибки 500, 502 и 503
  47. Связь HTTP-запроса с другими частями HTTP
  48. Частые вопросы
  49. Из чего состоит HTTP-запрос?
  50. Из чего состоит HTTP-ответ?
  51. Что такое HTTP-заголовок?
  52. Чем GET отличается от POST?
  53. Что означает код 404?

Иерархия знаний по HTTP

HTTP проще изучать не как разрозненный список правил, а как систему взаимосвязанных тем. Сначала полезно понять общую модель протокола, затем перейти к структуре сообщений, версиям, HTTPS, сетевому уровню, API и инструментам диагностики.

HTTP
├── HTTP: что это такое и как работает протокол
├── HTTP-запрос и HTTP-ответ: структура, методы, заголовки и коды
├── Версии HTTP: HTTP/1.0, HTTP/1.1, HTTP/2 и HTTP/3
├── HTTP и HTTPS: разница, безопасность и шифрование
├── HTTP в сетевой модели: TCP/IP, OSI, IP, DNS и порты
├── HTTP-сервер, URL и передача файлов: как работает веб
├── HTTP, API, REST, JSON и XML: как приложения обмениваются данными
└── HTTP: настройка, проверка и отладка

Эта статья посвящена центральному элементу такой иерархии — обмену между клиентом и сервером. Здесь будут разобраны протокол HTTP структура запроса ответа, назначение отдельных строк и правила интерпретации результата.

Что такое HTTP-запрос и HTTP-ответ

HTTP работает по модели «клиент — сервер». Клиентом может быть браузер, программа командной строки, мобильное приложение, поисковый робот или другой сервер. Он отправляет запрос на определённый ресурс, а сервер возвращает ответ. В простейшем случае браузер просит HTML-страницу, но тем же механизмом загружаются изображения, таблицы стилей, JSON-данные и файлы.

Главная идея HTTP проста: запрос описывает намерение клиента, а ответ сообщает результат обработки.

В классической модели HTTP обмен инициируется клиентом. Сервер обычно не отправляет данные сам по себе, пока не получил запрос, хотя современные технологии — WebSocket, Server-Sent Events и HTTP/2 Server Push — позволяют строить более сложные сценарии.

Участник Что делает Пример
Клиент Формирует и отправляет HTTP-запрос Браузер запрашивает /about/
Сервер Принимает запрос и выбирает обработчик Веб-сервер передаёт запрос приложению
Приложение Проверяет данные, обращается к базе, формирует результат CMS собирает HTML-страницу
Сервер Возвращает HTTP-ответ Статус 200 и тело с HTML

Как клиент отправляет HTTP-запрос

Перед отправкой клиент определяет схему соединения, доменное имя, порт, путь и метод. Для HTTPS дополнительно устанавливается защищённое TLS-соединение. Затем клиент формирует стартовую строку, добавляет заголовки и, если нужно, тело запроса.

Например, при открытии страницы https://cio-navigator.ru/http/ браузер сначала получает IP-адрес домена через DNS, устанавливает соединение с сервером и отправляет запрос примерно такого вида:

GET /http/ HTTP/1.1
Host: cio-navigator.ru
Accept: text/html,application/xhtml+xml
User-Agent: Mozilla/5.0

В HTTP/1.1 заголовок Host обязателен: один IP-адрес может обслуживать множество доменов, и серверу нужно понимать, какой именно сайт запрашивается.

Как сервер формирует HTTP-ответ

Сервер читает запрос сверху вниз: определяет метод, ресурс, заголовки и тело. После этого он проверяет права доступа, ищет файл или запускает программный обработчик, а затем формирует строку состояния, заголовки и тело ответа.

Этап Вопрос сервера Возможный результат
Маршрутизация Какой ресурс запрошен? /http/ → обработчик статьи
Проверка метода Разрешён ли GET или POST? GET разрешён, DELETE запрещён
Авторизация Есть ли у клиента нужные права? Доступ разрешён или 403 Forbidden
Подготовка данных Что вернуть клиенту? HTML, JSON, изображение или ошибка
Формирование ответа Как описать результат? Статус 200, Content-Type, тело

Ответ не обязательно содержит запрошенную страницу. Если ресурс перемещён, сервер может вернуть 301 или 302; если клиент не авторизован — 401; если страница отсутствует — 404. Поэтому код состояния является не украшением, а важной частью смысла ответа.

Связь между запросом и ответом

Один запрос обычно получает один ответ, но внутри страницы браузер может отправить десятки дополнительных запросов: за CSS, JavaScript, изображениями, шрифтами и данными API. Каждый такой обмен имеет собственный набор заголовков и собственный код состояния.

Запрос:
GET /http/ HTTP/1.1
Host: cio-navigator.ru

Ответ:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8

<!doctype html>
...

Важно различать HTTP-сообщение и сетевой пакет. Пакет протокола HTTP — бытовое, но не всегда точное выражение: HTTP-сообщение может передаваться через несколько TCP-сегментов или QUIC-пакетов. На уровне приложения мы анализируем именно сообщение, а не отдельный физический фрагмент передачи.

Структура HTTP-запроса

Протокол HTTP состоит из стартовой строки, заголовков, пустой строки-разделителя и необязательного тела. В HTTP/1.1 эти элементы видны почти буквально в виде текста. В HTTP/2 и HTTP/3 информация передаётся в бинарной форме, но логическая структура остаётся похожей.

Чтобы понять структуру протокола HTTP, достаточно задать четыре вопроса: какой метод используется, какой ресурс запрошен, какие условия переданы в заголовках и есть ли данные в теле.

Часть запроса Обязательность Назначение Пример
Стартовая строка Да Метод, путь и версия протокола GET /http/ HTTP/1.1
Заголовки Обычно нужны Метаданные и условия обработки Host, Accept, Authorization
Пустая строка Да как разделитель Отделяет заголовки от тела Пустая строка
Тело Не всегда Передаёт данные клиента JSON, форма, файл

Стартовая строка запроса

Стартовая строка имеет формат METHOD target HTTP/version. Метод сообщает намерение клиента, target обычно содержит путь и query-параметры, а версия определяет правила обмена.

POST /api/articles?draft=true HTTP/1.1

В этом примере POST указывает на отправку данных, путь равен /api/articles, параметр draft=true уточняет режим обработки, а HTTP/1.1 — используемая версия протокола.

В запросе к серверу также может использоваться абсолютный URL, особенно при обращении к прокси:

GET https://cio-navigator.ru/http/ HTTP/1.1

Заголовки HTTP-запроса

Заголовки передают метаданные: предпочитаемый формат ответа, тип тела, язык, сведения о клиенте, cookies и учётные данные. Они не являются обычным текстом для пользователя — это инструкции и характеристики, которые читают сервер, прокси или промежуточные системы.

Заголовок Что описывает Пример значения
Host Домен назначения cio-navigator.ru
Accept Форматы, приемлемые клиенту text/html, application/json
Content-Type Формат тела запроса application/json
Authorization Данные для аутентификации Bearer eyJ…
User-Agent Описание клиентского приложения Mozilla/5.0

Заголовки отделяются от тела пустой строкой. Если пустой строки нет, сервер может не понять, где заканчиваются метаданные и начинаются данные. В текстовом представлении каждая строка обычно завершается последовательностью CRLF.

Тело HTTP-запроса

Тело используется, когда клиент передаёт серверу содержимое: поля формы, JSON-документ, XML, изображение или файл. У GET-запроса тело технически возможно в некоторых реализациях, но его поддержка непредсказуема, поэтому данные для GET обычно помещают в URL.

POST /api/search HTTP/1.1
Host: cio-navigator.ru
Content-Type: application/json
Content-Length: 31

{"query":"HTTP","page":1}

Заголовок Content-Type объясняет, как интерпретировать тело, а Content-Length сообщает его размер в байтах. Вместо Content-Length может использоваться потоковая передача с Transfer-Encoding: chunked в HTTP/1.1.

URL и параметры запроса

URL состоит из нескольких частей: схемы, домена, порта, пути, строки запроса и иногда фрагмента. Фрагмент после символа # обычно не отправляется на сервер — его обрабатывает браузер внутри уже загруженного документа.

Часть URL Пример Роль
Схема https Определяет способ соединения
Домен cio-navigator.ru Имя сервера
Порт :443 Точка подключения
Путь /http/ Запрашиваемый ресурс
Query ?page=2 Параметры запроса
Фрагмент #headers Якорь внутри документа, серверу обычно не передаётся

Query-параметры

Query-параметры начинаются после знака вопроса и состоят из пар «имя=значение», разделённых амперсандом. Они подходят для фильтрации, сортировки, пагинации и поиска, то есть для уточнения того, какие данные нужно получить.

GET /http/?page=2&format=short HTTP/1.1
Host: cio-navigator.ru

Значения необходимо корректно кодировать. Пробел в URL может быть представлен как %20 или + в формах, а кириллица передаётся в percent-encoding. Нельзя помещать в URL пароли, токены и другую секретную информацию: URL часто сохраняется в истории, логах и аналитике.

Данные в теле запроса

Тело предпочтительнее query-параметров, когда клиент создаёт или изменяет ресурс, отправляет большой объём данных или передаёт структурированный документ. Формат тела должен быть явно указан.

Формат Content-Type Когда применяется
HTML-форма application/x-www-form-urlencoded Простые поля формы
Многочастные данные multipart/form-data Форма с файлами
JSON application/json REST API и обмен объектами
XML application/xml Интеграции и старые корпоративные API
Бинарные данные application/octet-stream Произвольный файл или поток байтов
POST /api/feedback HTTP/1.1
Host: cio-navigator.ru
Content-Type: application/x-www-form-urlencoded

name=Ivan&message=Hello

Структура HTTP-ответа

Ответ сервера устроен сходным образом: строка состояния, заголовки, пустая строка и необязательное тело. Однако вместо метода и пути в первой строке находятся версия протокола, числовой статус и краткая текстовая причина.

Один и тот же URL может возвращать разные ответы в зависимости от метода, заголовков, авторизации, cookies и состояния ресурса.

Часть ответа Пример Назначение
Строка состояния HTTP/1.1 200 OK Результат обработки
Заголовки Content-Type: text/html Метаданные ответа
Пустая строка — Разделитель
Тело <html>…</html> Содержимое ресурса

Строка состояния

Строка состояния имеет формат HTTP/version status-code reason-phrase. Числовой код важен для программ, а текстовая фраза удобна человеку. Программа должна ориентироваться прежде всего на код, поскольку текстовая часть может изменяться или отсутствовать в новых версиях протокола.

HTTP/1.1 404 Not Found

Первая цифра кода определяет класс результата: 1xx — информационный, 2xx — успешный, 3xx — перенаправление, 4xx — ошибка клиента, 5xx — ошибка сервера.

Заголовки ответа

Заголовки ответа описывают возвращаемые данные, правила кэширования, cookies, перенаправления и параметры безопасности. Например, Content-Type сообщает браузеру, что тело является HTML-документом, а Location указывает новый URL при редиректе.

HTTP/1.1 200 OK
Date: Tue, 12 Mar 2024 10:00:00 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 1280
Cache-Control: max-age=3600
X-Content-Type-Options: nosniff

Тело HTTP-ответа

Тело содержит фактический результат: HTML, JSON, изображение, CSS, JavaScript или текстовое описание ошибки. У ответов 204 No Content и 304 Not Modified тела обычно нет, а у HEAD тело не передаётся по определению, хотя заголовки должны описывать аналогичный GET-ответ.

Тип и размер тела определяются заголовками. Если сервер возвращает сжатые данные, он может добавить Content-Encoding: gzip или br. Клиент распаковывает тело перед передачей его приложению.

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 48

{"status":"ok","site":"cio-navigator.ru"}

Методы HTTP-запросов — Таблица

Метод показывает, какую операцию хочет выполнить клиент. Это не просто условное слово: метод влияет на кэширование, повторяемость операции, допустимость тела и требования к безопасности.

Метод Назначение Типичные сценарии Особенности
GET Получить ресурс Страница, файл, список API Не должен изменять состояние; может кэшироваться
POST Передать данные для обработки Создание записи, форма, запуск операции Обычно не идемпотентен
PUT Создать или полностью заменить ресурс Полное обновление объекта Идемпотентен при корректной реализации
PATCH Частично изменить ресурс Изменение одного поля Формат изменений зависит от API
DELETE Удалить ресурс Удаление записи или файла Повторный вызов обычно не меняет результат
HEAD Получить только заголовки Проверка доступности и размера Тело ответа не передаётся
OPTIONS Узнать поддерживаемые возможности CORS preflight, диагностика API Может вернуть Allow

GET

GET используется для получения представления ресурса. Хороший GET-запрос не должен менять данные на сервере: повторное обновление страницы не должно создавать новые записи или списывать деньги.

GET /http/ HTTP/1.1
Host: cio-navigator.ru
Accept: text/html
User-Agent: Mozilla/5.0

GET может содержать параметры фильтрации и сортировки в URL. Ответы на GET часто кэшируются браузером, CDN или прокси, если сервер разрешил это заголовками.

POST

POST передаёт данные обработчику. Метод применяют для создания ресурса, отправки формы, загрузки файла или запуска действия, которое нельзя выразить простым получением URL.

POST /api/search HTTP/1.1
Host: cio-navigator.ru
Content-Type: application/json
Accept: application/json

{"query":"HTTP-запрос","page":1}

Повторная отправка POST может создать два одинаковых заказа или два обращения. Поэтому для важных операций используют защиту от повторов: уникальный идентификатор операции, Idempotency-Key или проверку на стороне приложения.

PUT

PUT обычно означает полную замену ресурса по указанному адресу. Если клиент отправит один и тот же PUT несколько раз, итоговое состояние должно оставаться одинаковым — это свойство называется идемпотентностью.

PUT /api/articles/42 HTTP/1.1
Host: cio-navigator.ru
Content-Type: application/json

{"title":"HTTP","status":"published","content":"Обновлённый текст"}

PATCH

PATCH предназначен для частичного изменения. В отличие от PUT, клиент не обязан передавать весь объект — только изменяемые поля или инструкцию изменения.

PATCH /api/articles/42 HTTP/1.1
Host: cio-navigator.ru
Content-Type: application/json

{"status":"published"}

Конкретная форма PATCH определяется API. Это может быть обычный JSON с полями, JSON Merge Patch или JSON Patch с массивом операций.

DELETE

DELETE просит удалить ресурс. Удаление может быть физическим, логическим или помещать объект в корзину — HTTP сам по себе не диктует внутренний способ.

DELETE /api/articles/42 HTTP/1.1
Host: cio-navigator.ru
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...

Успешный ответ может иметь статус 204 No Content, 200 OK с описанием результата или 202 Accepted, если удаление выполняется асинхронно.

HEAD повторяет семантику GET, но сервер не должен отправлять тело. Это удобно, когда нужно узнать размер файла, дату изменения или проверить доступность ресурса без скачивания содержимого.

HEAD /http/ HTTP/1.1
Host: cio-navigator.ru
Accept: text/html

OPTIONS

OPTIONS позволяет узнать доступные методы и используется браузерами перед некоторыми кросс-доменными запросами. Такой предварительный запрос называется CORS preflight.

OPTIONS /api/articles HTTP/1.1
Host: cio-navigator.ru
Origin: https://example.com
Access-Control-Request-Method: POST

Заголовки HTTP

HTTP-заголовки — это пары «имя: значение», сопровождающие запрос или ответ. Они позволяют передавать служебную информацию, не смешивая её с основным содержимым. Заголовки могут добавляться браузером, сервером, прокси, CDN и прикладным кодом.

Заголовок не меняет сам ресурс; он сообщает, как именно следует понимать, передавать или обрабатывать сообщение.

Что такое HTTP-заголовки

Имена заголовков нечувствительны к регистру: Content-Type и content-type обозначают одно и то же поле. Значение зависит от конкретного заголовка и может включать параметры, например кодировку символов.

Группа Примеры Назначение
Представление Content-Type, Content-Encoding Описание формата и кодирования тела
Кэширование Cache-Control, ETag, If-None-Match Управление повторным использованием ответа
Аутентификация Authorization, WWW-Authenticate Подтверждение личности и запроса учётных данных
Безопасность Strict-Transport-Security, CSP Ограничение опасных сценариев
Маршрутизация Host, Location Выбор домена и нового адреса

Заголовки запроса

Запросные заголовки описывают клиента и его ожидания. Например, Accept позволяет выбрать формат ответа, а If-Modified-Since помогает не скачивать неизменившийся ресурс повторно.

Заголовки ответа

Ответные заголовки описывают серверный результат. Set-Cookie устанавливает cookie, Location задаёт адрес перенаправления, а Vary предупреждает кэш о том, что результат зависит от конкретного запросного заголовка.

GET /http/ HTTP/1.1
Host: cio-navigator.ru
Accept: text/html,application/xhtml+xml
Accept-Encoding: gzip, deflate, br
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Cache-Control: max-age=0
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Cookie: session_id=abc123

HTTP/1.1 200 OK
Date: Tue, 12 Mar 2024 10:00:00 GMT
Server: nginx
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Content-Length: 1842
Cache-Control: public, max-age=3600
ETag: "a1b2c3"
Vary: Accept-Encoding
X-Content-Type-Options: nosniff

[сжатое тело HTML]

Content-Type

Content-Type показывает MIME-тип тела. Для HTML обычно используется text/html, для JSON — application/json, для изображения PNG — image/png. Параметр charset уточняет кодировку символов.

Content-Type: application/json; charset=UTF-8

Content-Type запроса и ответа — не одно и то же. В запросе он описывает отправленные данные, а в ответе — возвращённые сервером.

Content-Length

Content-Length указывает длину тела в байтах, а не количество символов. Это различие важно для UTF-8: русская буква обычно занимает несколько байтов.

Content-Length: 48

При сжатии значение относится к передаваемому, уже сжатому телу. Если используется chunked-передача, Content-Length может отсутствовать.

Authorization

Authorization передаёт данные аутентификации. Популярная схема Bearer используется с токенами доступа, Basic — с кодированными именем пользователя и паролем. Base64 в Basic не является шифрованием, поэтому такой вариант допустим только поверх HTTPS.

GET /api/profile HTTP/1.1
Host: cio-navigator.ru
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...

Accept

Accept сообщает, какие форматы ответа способен обработать клиент. Сервер может выбрать наиболее подходящий формат или вернуть 406 Not Acceptable, если подходящего представления нет.

Accept: application/json, text/html;q=0.9, */*;q=0.8

Параметр q задаёт относительный приоритет: чем выше значение, тем предпочтительнее формат.

User-Agent

User-Agent содержит описание клиента. Серверы используют его для статистики, совместимости и иногда адаптации содержимого, однако полагаться на него как на надёжный признак нельзя: строку легко изменить.

User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/122.0 Safari/537.36

Коды состояния HTTP — Таблица

Коды ответа протокола HTTP позволяют быстро понять, чем завершилась обработка запроса. Код 4xx обычно указывает на проблему в запросе или правах клиента, а 5xx — на сбой сервера или промежуточного узла.

Код Название Значение Что обычно делать
200 OK Запрос успешно выполнен Использовать тело ответа
201 Created Ресурс создан Проверить Location и тело
301 Moved Permanently Постоянное перенаправление Обновить ссылку или кэш
302 Found Временное перенаправление Перейти по Location временно
304 Not Modified Ресурс не изменился Взять копию из кэша
400 Bad Request Некорректный запрос Проверить синтаксис и данные
401 Unauthorized Нет корректной аутентификации Передать или обновить учётные данные
403 Forbidden Доступ запрещён Проверить права и политики
404 Not Found Ресурс не найден Проверить URL и маршрутизацию
405 Method Not Allowed Метод запрещён для ресурса Проверить Allow и документацию API
408 Request Timeout Клиент не успел отправить запрос Проверить сеть и тайм-ауты
409 Conflict Конфликт состояния ресурса Синхронизировать данные
429 Too Many Requests Слишком много запросов Снизить частоту, учесть Retry-After
500 Internal Server Error Внутренняя ошибка приложения Изучить серверные логи
502 Bad Gateway Плохой ответ вышестоящего сервера Проверить прокси и upstream
503 Service Unavailable Сервис временно недоступен Повторить позже, проверить нагрузку
504 Gateway Timeout Upstream не ответил вовремя Проверить тайм-ауты и зависимые сервисы

Один и тот же код может иметь разные причины. Например, 404 бывает результатом опечатки в URL, удалённой страницы или неправильно настроенного маршрута. Поэтому код — это отправная точка диагностики, а не полный отчёт о неисправности.

Коды 1xx

Информационные ответы 1xx сообщают о промежуточном состоянии. Наиболее известен 100 Continue: сервер подтверждает, что клиент может продолжать отправку тела запроса.

POST /api/upload HTTP/1.1
Host: cio-navigator.ru
Expect: 100-continue
Content-Length: 10485760

HTTP/1.1 100 Continue

После такого ответа клиент отправляет тело. В обычной отладке коды 1xx могут быть незаметны, потому что библиотека скрывает их от прикладного кода.

Коды 2xx

Класс 2xx означает успешную обработку. 200 подходит для обычного результата, 201 — для создания ресурса, 202 — для принятой, но ещё не завершённой операции, а 204 — для успешного результата без тела.

POST /api/articles HTTP/1.1
Host: cio-navigator.ru
Content-Type: application/json

{"title":"Новая статья"}

HTTP/1.1 201 Created
Location: /api/articles/43
Content-Type: application/json

{"id":43,"title":"Новая статья"}

Коды 3xx

Коды 3xx связаны с перенаправлением или кэшированием. Для редиректов важен заголовок Location. Код 304 не означает ошибку: сервер сообщает, что клиент может использовать сохранённую копию.

GET /old-http-page HTTP/1.1
Host: cio-navigator.ru

HTTP/1.1 301 Moved Permanently
Location: https://cio-navigator.ru/http/
GET /http/ HTTP/1.1
Host: cio-navigator.ru
If-None-Match: "a1b2c3"

HTTP/1.1 304 Not Modified
ETag: "a1b2c3"

Коды 4xx

Коды 4xx указывают, что сервер не может или не должен выполнить запрос в представленном виде. Это может быть неверный JSON, отсутствие токена, недостаток прав, неправильный метод или слишком частые обращения.

GET /private HTTP/1.1
Host: cio-navigator.ru

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer
Content-Type: application/json

{"error":"authentication_required"}

Коды 5xx

Коды 5xx означают проблему на серверной стороне или между серверами. Если сайт использует reverse proxy, CDN и отдельное приложение, ошибка может возникнуть на любом звене цепочки.

GET /api/articles HTTP/1.1
Host: cio-navigator.ru

HTTP/1.1 502 Bad Gateway
Content-Type: text/html; charset=UTF-8

<html><body>Bad Gateway</body></html>

Ошибка протокола HTTP не всегда означает поломку самого HTTP. Часто протокол исправно доставил запрос, а проблема возникла в приложении, базе данных, прокси или внешнем сервисе.

Как выглядит HTTP-запрос — Пример

Рассмотрим полный GET-запрос к странице cio-navigator.ru. В нём нет тела: клиенту достаточно указать ресурс и сообщить серверу свои предпочтения.

GET /http/ HTTP/1.1
Host: cio-navigator.ru
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: ru-RU,ru;q=0.9
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/122.0 Safari/537.36

Разбор примера выглядит так:

  • GET — запрос на получение ресурса;
  • /http/ — путь страницы;
  • HTTP/1.1 — версия протокола;
  • Host — домен, к которому обращается клиент;
  • Accept — предпочтительные форматы ответа;
  • Accept-Encoding — поддерживаемые способы сжатия;
  • User-Agent — сведения о клиенте;
  • пустая строка — признак окончания заголовков и отсутствия тела.

Как выглядит HTTP-ответ — Пример

Теперь сервер возвращает HTML-документ. Размер тела в примере условный, поскольку реальный объём страницы зависит от содержимого, сжатия и настроек сервера.

HTTP/1.1 200 OK
Date: Tue, 12 Mar 2024 10:00:00 GMT
Server: nginx
Content-Type: text/html; charset=UTF-8
Content-Length: 96
Cache-Control: public, max-age=3600
ETag: "page-http-20240312"
X-Content-Type-Options: nosniff

<!doctype html>
<html lang="ru">
<head><title>HTTP</title></head>
<body>Страница о протоколе HTTP</body>
</html>

Клиент видит статус 200 и понимает, что обработка успешна. Content-Type говорит браузеру отобразить тело как HTML, charset задаёт кодировку, Cache-Control разрешает кэширование, а ETag помогает позднее проверить, изменился ли документ.

HTTP GET и POST — сравнение — Таблица

GET и POST встречаются чаще остальных методов, поэтому их различия важно понимать не только на уровне «у одного есть тело, у другого нет». Их семантика влияет на безопасность, кэширование, повторную отправку и проектирование API.

Критерий GET POST
Основное назначение Получение ресурса Передача данных для обработки
Параметры Обычно находятся в URL Обычно находятся в теле
Тело запроса Как правило, отсутствует Часто используется
Кэширование Часто возможно Обычно не кэшируется автоматически
Видимость данных Параметры видны в URL и логах Тело не отображается в адресной строке, но всё равно должно защищаться HTTPS
Идемпотентность Должна сохраняться Не гарантируется
Пример Поиск, просмотр статьи Форма, создание записи

POST не является автоматически «безопасным», а GET не является способом защитить данные. Секреты нельзя передавать ни в URL, ни в незащищённом теле. Для конфиденциальности нужен HTTPS, а для защиты от повторной отправки и CSRF — дополнительные прикладные механизмы.

Типичные ошибки HTTP

При диагностике ошибки полезно отделять код от причины. Один и тот же статус может появиться из-за разных настроек, поэтому следует смотреть URL, метод, заголовки, тело запроса и серверные журналы.

Ошибки 400 и 401

400 означает, что сервер не смог корректно разобрать запрос. Частые причины — повреждённый JSON, отсутствующее обязательное поле, неверный query-параметр или слишком большой заголовок. 401 связан с отсутствием корректной аутентификации.

POST /api/search HTTP/1.1
Host: cio-navigator.ru
Content-Type: application/json

{"query":

HTTP/1.1 400 Bad Request
Content-Type: application/json

{"error":"invalid_json"}
GET /api/profile HTTP/1.1
Host: cio-navigator.ru
Authorization: Bearer expired-token

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer
Content-Type: application/json

{"error":"invalid_token"}

При 400 нужно проверять формат и обязательные поля, а при 401 — наличие токена, его срок действия, схему Authorization и корректность передачи cookies.

Ошибки 403 и 404

403 означает, что сервер понял запрос, но отказал в доступе. 404 сообщает, что ресурс не найден или сервер намеренно не раскрывает его существование. Разница важна: исправление URL помогает при 404, но не решает проблему отсутствующих прав при 403.

DELETE /api/articles/42 HTTP/1.1
Host: cio-navigator.ru
Authorization: Bearer user-token

HTTP/1.1 403 Forbidden
Content-Type: application/json

{"error":"insufficient_permissions"}
GET /http/does-not-exist/ HTTP/1.1
Host: cio-navigator.ru

HTTP/1.1 404 Not Found
Content-Type: text/html; charset=UTF-8

<h1>Страница не найдена</h1>

Для 404 проверяют слеши, регистр пути, правила rewrite, маршруты приложения и наличие файла. Для 403 дополнительно изучают ACL, роли пользователя, настройки веб-сервера и правила WAF.

Ошибки 500, 502 и 503

500 говорит о внутреннем исключении или другой необработанной проблеме приложения. 502 часто возвращает reverse proxy, когда не получил корректный ответ от upstream. 503 означает временную недоступность: перегрузку, технические работы или отсутствие готового экземпляра приложения.

GET /api/report HTTP/1.1
Host: cio-navigator.ru

HTTP/1.1 500 Internal Server Error
Content-Type: application/json

{"error":"internal_server_error","request_id":"req-7f31"}
GET /api/news HTTP/1.1
Host: cio-navigator.ru

HTTP/1.1 502 Bad Gateway
Content-Type: text/plain

upstream prematurely closed connection
GET /api/articles HTTP/1.1
Host: cio-navigator.ru

HTTP/1.1 503 Service Unavailable
Retry-After: 60
Content-Type: application/json

{"error":"service_temporarily_unavailable"}

Пользователю при 5xx обычно достаточно повторить операцию позже, если она безопасна. Администратору нужно проверить логи приложения, состояние базы данных, соединения между сервисами, лимиты ресурсов и тайм-ауты прокси.

Связь HTTP-запроса с другими частями HTTP

Основная статья: HTTP: что это такое и как работает протокол

Структура запроса и ответа — только один уровень общей модели HTTP. Сначала DNS превращает доменное имя в IP-адрес, затем транспортный протокол устанавливает соединение, а HTTP передаёт прикладные сообщения. При HTTPS между HTTP и транспортом добавляется TLS, который шифрует содержимое и проверяет сертификат сервера.

Уровень Что происходит Пример
DNS Имя преобразуется в IP-адрес cio-navigator.ru → 203.0.113.10
TCP или QUIC Создаётся транспортный обмен TCP:443 или QUIC/UDP:443
TLS Устанавливается шифрование HTTPS Проверка сертификата
HTTP Передаются запросы и ответы GET, заголовки, статус, тело
Приложение Обрабатываются бизнес-правила Поиск статьи или создание записи

Версия HTTP тоже меняет способ передачи, но не отменяет базовые понятия. В HTTP/1.1 строки и заголовки обычно видны в текстовом виде. HTTP/2 использует бинарные фреймы и мультиплексирование потоков, HTTP/3 работает поверх QUIC. При этом метод, статус, заголовки и тело остаются понятными концепциями для разработчика.

На практике для анализа используют инструменты разработчика браузера, curl, Postman, журналы reverse proxy и трассировку приложения. Важно помнить: просмотр через браузер может скрывать часть технических деталей, автоматически добавлять cookies, следовать редиректам и распаковывать сжатые ответы.

curl -i -X GET "https://cio-navigator.ru/http/" 
  -H "Accept: text/html" 
  -A "HTTP-Diagnostic-Client/1.0"

Частые вопросы

Ниже собраны короткие ответы на вопросы, которые чаще всего возникают при чтении HTTP-трафика.

Из чего состоит HTTP-запрос?

HTTP-запрос состоит из стартовой строки, заголовков, пустой строки и необязательного тела. В стартовой строке находятся метод, путь с параметрами и версия протокола. В теле передаются JSON, данные формы, файл или другой контент.

Из чего состоит HTTP-ответ?

HTTP-ответ включает строку состояния, заголовки, пустую строку и необязательное тело. Строка состояния содержит версию протокола, числовой код и текстовое описание результата.

Что такое HTTP-заголовок?

HTTP-заголовок — это поле с именем и значением, которое описывает запрос или ответ. Заголовки передают тип содержимого, размер, авторизацию, сведения о клиенте, правила кэширования и другие метаданные.

Чем GET отличается от POST?

GET предназначен главным образом для получения ресурса, а POST — для передачи данных на обработку. Параметры GET обычно находятся в URL и могут кэшироваться, тогда как данные POST чаще помещаются в тело и обычно не кэшируются автоматически.

Что означает код 404?

404 Not Found означает, что сервер не нашёл ресурс по указанному адресу либо не хочет сообщать о его существовании. Нужно проверить URL, маршрут, домен, наличие конечного слеша и настройки перенаправлений.

Понимание того, как выглядит протокол HTTP, превращает диагностику веб-проблем из гадания в последовательный анализ: сначала проверяется запрос, затем ответ, после этого — маршрутизация, права, приложение и инфраструктура. Именно так раскрывается формат протокола HTTP и становится понятной вся цепочка обмена между клиентом и сервером.

CIO-NAVIGATOR