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 →

