Перейти к содержанию

HTTP-запрос

Раздел описывает структуру HTTP-запросов и способы их обработки в Rapidy.

Описание

Веб-запрос — это запрос, который клиент, например, веб-браузер, отправляет серверу для получения веб-страницы или другого ресурса.

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

HTTP-запрос состоит из стартовой строки, заголовков и тела.

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

Пример: GET /index.html HTTP/1.1

Стартовая строка HTTP-запроса включает:

  • Метод HTTP-запроса (method, реже используется термин verb) — короткое слово, определяющее, какое действие нужно выполнить с запрашиваемым ресурсом.
  • Цель запроса — URL-адрес ресурса, состоящий из протокола, доменного имени (или IP-адреса), пути к ресурсу на сервере, а также, возможно, порта, параметров HTTP-запроса и других опциональных элементов.
  • Версию протокола (HTTP-протокол)HTTP/1.1.
Методы HTTP-запросов
Метод Описание
GET Запрос информации.
HEAD Запрос только заголовков.
POST Отправка данных (например, формы входа, текста, PDF-документов, двоичных данных).
PUT Создание нового ресурса.
PATCH Частичное обновление ресурса.
DELETE Удаление ресурса.
OPTIONS Запрос информации о сервере (например, поддерживаемых HTTP-методах для ресурса).
Версии HTTP-протокола

Стандарты HTTP разрабатываются Internet Engineering Task Force (IETF) и World Wide Web Consortium (W3C), что приводит к публикации серии Requests for Comments (RFC).

Версия Тип протокола Транспортный уровень Описание
HTTP/1.1 Текстовый TCP Требует ожидания ответа перед отправкой следующего запроса в одном соединении.
HTTP/2 Бинарный TCP Позволяет многопоточное использование соединения без ожидания завершения предыдущего запроса.
HTTP/3 Бинарный UDP (QUIC) Работает поверх UDP, обеспечивая более быструю и надежную передачу данных.

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

HTTP-заголовок представляет собой строку вида Имя-Заголовка: Значение, где двоеточие (:) служит разделителем. Названия заголовков регистронезависимы: Host и host воспринимаются одинаково. Принято начинать каждое слово заголовка с заглавной буквы.

Примеры заголовков
Категория Описание
Host Указывает хост, с которого запрашивается ресурс (может быть доменное имя или IP-адрес).
User-Agent Содержит информацию о клиенте (браузер, его версия, ОС пользователя).
Referer Показывает, откуда был сделан текущий запрос.
Cookie Передает куки пользователя.
Content-Type Определяет тип данных, передаваемых в теле запроса.
Authorization Передает учетные данные для аутентификации клиента на сервере.

Тело запроса

Тело запроса является опциональным и содержит данные, связанные с запросом. Тип передаваемой информации указывается в заголовке Content-Type. Тело запроса может быть JSON-объектом, медиафайлом, документом, текстом, последовательностью байтов и т. д.

Управление HTTP-запросом

Для обработки HTTP-запросов Rapidy использует сущность Request.

Подробнее об объекте Request

Rapidy основан на механизмах aiohttp и использует aiohttp.web.Request. Фактически rapidy.http.Request является ссылкой на aiohttp.web.Request для удобства работы.

Подробнее о aiohttp.web.Request можно узнать здесь.

Этот раздел описывает, как получать и проверять данные из входящего HTTP-запроса с помощью Rapidy.

Получение данных через параметры запроса

Вы можете извлечь и валидировать любой параметр HTTP-запроса, используя pydantic и функционал Rapidy.

Извлечение параметра из rapidy.http, rapidy.parameters.http или rapidy.web (стиль aiohttp).

from rapidy.http import PathParam, Header, Cookie, QueryParam, Body, get

@get('/{user_id}')
async def handler(
        user_id: int = PathParam(),
        host: str = Header(alias='Host'),
        session: str = Cookie(alias='UserSession'),
        age_filter: str = QueryParam(alias='AgeFilter'),
        data: str = Body(),
) -> ...:
Импорт из rapidy.parameters.http.
from rapidy.http import get
from rapidy.parameters.http import PathParam, Header, Cookie, QueryParam, Body

@get('/{user_id}')
async def handler(
        user_id: int = PathParam(),
        host: str = Header(alias='Host'),
        session: str = Cookie(alias='UserSession'),
        age_filter: str = QueryParam(alias='AgeFilter'),
        data: str = Body(),
) -> ...:
Импорт из rapidy.web (aiohttp style).
from rapidy import web

routes = web.RouteTableDef()

@routes.get('/{user_id}')
async def handler(
        user_id: int = web.PathParam(),
        host: str = web.Header(alias='Host'),
        session: str = web.Cookie(alias='UserSession'),
        age_filter: str = web.QueryParam(alias='AgeFilter'),
        data: str = web.Body(),
) -> ...:

Подробнее см. раздел Parameters.

Получение данных через объект запроса

Вы также можете получать данные напрямую из объекта rapidy.http.Request, добавив его как аргумент в HTTP-обработчик.

from rapidy.http import get, Request

@get('/{user_id}')
async def handler(
    request: Request,
) -> ...:
    path_params = request.match_info  # dict[str, str]
    headers = request.headers  # CIMultiDictProxy[str]
    cookies = request.cookies  # Mapping[str, str]
    query_params = request.rel_url.query  # MultiDictProxy[str]
    json_body = await request.json()  # Any
    text_body = await request.text()  # str
    bytes_body = await request.read()  # bytes
    stream_body = request.content  # StreamReader

Если у аргумента обработчика указан тип Request, порядок его расположения не имеет значения.

from rapidy.http import get, Header, Request

@get('/')
async def handler(
        host: str = Header(alias='Host'),
        *,
        request: Request,
) -> ...:

Если у первого аргумента обработчика не указан тип, Rapidy автоматически подставит Request.

from rapidy.http import get

@get('/')
async def handler(
        any_attr,
) -> ...:
    print(type(any_attr))
    # web.Request

Rapidy использует встроенные механизмы aiohttp для извлечения данных.

Подробнее о aiohttp.web.Request и методах получения данных из него можно узнать здесь.