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
и методах получения данных из него можно узнать здесь.