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, порядок его расположения не имеет значения.
Если у первого аргумента обработчика не указан тип, Rapidy автоматически подставит Request.
Rapidy использует встроенные механизмы aiohttp для извлечения данных.
Подробнее о aiohttp.web.Request и методах получения данных из него можно узнать здесь.