Открыть сервис

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

HTTP-запрос — это структурированное сообщение, отправляемое клиентом (например, веб-браузером) на сервер по протоколу передачи гипертекста (HTTP) для получения ресурса, выполнения действия или взаимодействия с веб-приложением. Протокол HTTP лежит в основе передачи данных во Всемирной паутине и определяет формат обмена сообщениями между клиентом и сервером.

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

HTTP-запрос состоит из трёх основных частей: стартовой строки (request line), заголовков (headers) и тела сообщения (body). Стартовая строка содержит метод запроса, целевой URI (унифицированный идентификатор ресурса) и версию протокола. Например, в запросе GET /index.html HTTP/1.1 методом является GET, целевым ресурсом — /index.html, а версией — HTTP/1.1.

Заголовки запроса представляют собой набор пар «имя: значение», разделённых двоеточием. Они передают серверу метаданные о запросе: тип клиента (User-Agent), принимаемые форматы ответа (Accept), язык (Accept-Language), параметры кэширования (Cache-Control), данные авторизации (Authorization) и другие. Каждый заголовок завершается парой символов CRLF (возврат каретки и перевод строки).

Тело запроса является опциональным и обычно используется с методами, которые передают данные на сервер (например, POST или PUT). Тело может содержать данные HTML-форм, JSON-объекты, файлы или другой контент. Перед телом обязательно идёт пустая строка, отделяющая его от заголовков. Длина тела указывается в заголовке Content-Length либо передаётся по частям с использованием заголовка Transfer-Encoding: chunked.

Методы HTTP-запросов

Метод HTTP-запроса определяет семантику выполняемого действия над ресурсом. Спецификация HTTP/1.1 определяет восемь основных методов, хотя современные расширения добавляют и другие.

  • GET — запрашивает представление ресурса без изменения его состояния. Является самым распространённым методом и используется для навигации по веб-страницам.
  • POST — отправляет данные на сервер для создания нового ресурса или выполнения процесса. Применяется при отправке форм, загрузке файлов, создании записей в базах данных.
  • PUT — полностью заменяет целевой ресурс переданными данными. Если ресурс не существует, он может быть создан.
  • PATCH — частично изменяет ресурс, применяя к нему переданные изменения.
  • DELETE — удаляет указанный ресурс на сервере.
  • HEAD — аналогичен GET, но сервер возвращает только заголовки без тела ответа. Используется для проверки доступности ресурса или получения метаданных.
  • OPTIONS — запрашивает информацию о поддерживаемых сервером методах для конкретного ресурса.
  • TRACE — возвращает клиенту полученное сообщение для диагностики и проверки промежуточных серверов.

Методы также классифицируются по свойствам безопасности и идемпотентности. Безопасными считаются методы, не изменяющие состояние сервера (GET, HEAD, OPTIONS, TRACE). Идемпотентные методы дают одинаковый результат при многократном повторении (GET, PUT, DELETE, HEAD, OPTIONS, TRACE). POST и PATCH не являются идемпотентными.

Версии протокола и эволюция

Первая версия HTTP/0.9, предложенная Тимом Бернерсом-Ли в 1991 году, поддерживала только метод GET и не имела заголовков. HTTP/1.0, стандартизированный в 1996 году, добавил заголовки, методы POST и HEAD, а также коды состояния. HTTP/1.1, принятый в 1997 году и действующий до сих пор, ввёл постоянные соединения, конвейеризацию и виртуальные хосты.

HTTP/2, опубликованный в 2015 году, сохранил семантику запросов, но изменил способ передачи: сообщения разбиваются на бинарные фреймы, мультиплексируются по одному TCP-соединению и передаются со сжатием заголовков. HTTP/3, основанный на протоколе QUIC (работающем поверх UDP), продолжил развитие в сторону снижения задержек и повышения устойчивости к потере пакетов. Несмотря на появление новых версий, структура запроса — метод, URI и заголовки — осталась неизменной.

Коды состояния ответа

Сервер отвечает на HTTP-запрос сообщением, которое начинается со строки статуса, содержащей трёхзначный код. Коды состояния группируются по классам:

  • 1xx (Информационные) — запрос принят, обработка продолжается. Например, 100 Continue.
  • 2xx (Успешные) — запрос успешно обработан. Коды 200 OK, 201 Created, 204 No Content.
  • 3xx (Перенаправления) — для выполнения запроса требуются дополнительные действия. Коды 301 Moved Permanently, 302 Found, 304 Not Modified.
  • 4xx (Ошибки клиента) — запрос содержит ошибку и не может быть выполнен. Коды 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found.
  • 5xx (Ошибки сервера) — сервер не смог обработать корректный запрос. Коды 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable.

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

Заголовки HTTP-запроса делятся на несколько категорий по назначению. Контекстные заголовки описывают сам запрос: Host (доменное имя сервера), Referer (адрес предыдущей страницы), Origin (источник запроса). Заголовки содержимого описывают тело запроса: Content-Type, Content-Length, Content-Encoding.

Условные заголовки позволяют серверу оптимизировать ответ: If-Modified-Since, If-None-Match используются для кэширования. Заголовки аутентификации передают учётные данные: Authorization (токен или базовые учётные данные), Cookie (ранее установленные сервером куки). Заголовки управления соединением включают Connection: keep-alive или Connection: close.

Примеры HTTP-запросов

Типичный GET-запрос к веб-сайту выглядит следующим образом:

`` GET /wiki/HTTP HTTP/1.1 Host: ru.wikipedia.org User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Accept: text/html,application/xhtml+xml Accept-Language: ru-RU,ru;q=0.9 Connection: keep-alive ``

Запрос POST с отправкой данных формы:

``` POST /api/users HTTP/1.1 Host: example.com Content-Type: application/json Content-Length: 42 Authorization: Bearer eyJhbGciOiJI

{"name":"Иван","age":30} ```

Безопасность HTTP-запросов

Протокол HTTP передаёт данные в открытом виде, что делает их уязвимыми для перехвата и модификации. Для защиты используется расширение HTTPS (HTTP Secure), которое шифрует трафик с помощью протоколов TLS (Transport Layer Security) или его предшественника SSL (Secure Sockets Layer). HTTPS обеспечивает конфиденциальность, целостность и аутентификацию сервера, поэтому современные веб-сервисы используют его по умолчанию.

Распространёнными атаками на HTTP-запросы являются межсайтовый скриптинг (XSS), подделка межсайтовых запросов (CSRF), SQL-инъекции и перехват сессий. Для защиты от них применяются валидация входных данных, CSRF-токены, политики безопасности контента (CSP) и другие меры.

Применение в архитектуре веб-приложений

HTTP-запросы являются основой архитектуры REST (Representational State Transfer) — стиля проектирования API, где ресурсы идентифицируются URI, а действия над ними выполняются стандартными методами HTTP. В RESTful-сервисах GET используется для чтения, POST — для создания, PUT и PATCH — для обновления, DELETE — для удаления ресурсов.

Браузеры автоматически формируют HTTP-запросы при загрузке веб-страниц, отправке форм и выполнении AJAX-запросов. Прокси-серверы, балансировщики нагрузки и CDN (сети доставки контента) обрабатывают и модифицируют HTTP-запросы на промежуточных этапах. Понимание структуры HTTP-запросов необходимо для веб-разработки, отладки сетевых приложений, настройки серверов и анализа безопасности.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →