X-WWW-Form-Urlencoded
Чтение тела запроса как application/x-www-form-urlencoded.
Описание
X-WWW-Form-Urlencoded (MIME-type: application/x-www-form-urlencoded) — это распространённый тип контента, используемый для передачи данных через HTML-формы в Интернете.
Формат представляет собой строку с парами ключ-значение в виде:
key1=value1&key2=value2.
from pydantic import BaseModel
from rapidy.http import post, Body, ContentType
class UserData(BaseModel):
username: str
password: str
@post('/')
async def handler(
user_data: UserData = Body(content_type=ContentType.x_www_form),
# or
user_data: UserData = Body(content_type='application/x-www-form-urlencoded'),
) -> ...:
Отправка с помощью curl
Извлечение без валидации
Отключение валидации не рекомендуется.
Если валидация отключена, параметр будет содержать базовую структуру aiohttp:
Body(content_type=ContentType.x_www_form)→MultiDictProxy[str]
Способы отключения валидации
Явное отключение
from pydantic import BaseModel
from rapidy.http import post, Body, ContentType
class BodyData(BaseModel):
...
@post('/')
async def handler(
data: BodyData = Body(validate=False, content_type=ContentType.x_www_form),
) -> ...:
Использование Any
Отсутствие аннотации типа
Значения по умолчанию
Если HTTP-запрос не содержит тела, параметр получит указанное значение по умолчанию (если оно задано).
Примеры использования
Указано значение по умолчанию
from pydantic import BaseModel
from rapidy.http import post, Body, ContentType
class BodyData(BaseModel):
...
@post('/')
async def handler(
data: BodyData = Body('some_data', content_type=ContentType.x_www_form),
# or
data: BodyData = Body(default_factory=lambda: 'some_data', content_type=ContentType.x_www_form),
) -> ...:
Опциональное тело запроса
from pydantic import BaseModel
from rapidy.http import post, Body, ContentType
class BodyData(BaseModel):
...
@post('/')
async def handler(
data: BodyData | None = Body(content_type=ContentType.x_www_form),
# or
data: Optional[BodyData] = Body(content_type=ContentType.x_www_form),
# or
data: Union[BodyData, None] = Body(content_type=ContentType.x_www_form),
) -> ...:
Извлечение сырых данных
Rapidy использует метод post объекта Request для получения данных и передаёт их в Pydantic для валидации.
Как происходит извлечение внутри Rapidy
Rapidy использует встроенные механизмы aiohttp.
Подробнее об объекте aiohttp.Request и методах извлечения данных можно узнать
здесь.
x-www-form-urlencoded и multipart/form-data обрабатываются одинаково.
Оба этих типа данных извлекаются через метод post объекта Request, что является особенностью реализации aiohttp.
Однако, если параметр аннотирован как bytes или StreamReader, данные извлекаются иначе.
Подробнее об объекте StreamReader можно узнать здесь.
bytes
@post('/')
async def handler(
user_data: bytes = Body(content_type=ContentType.x_www_form),
# also you can use pydantic validation
user_data: bytes = Body(content_type=ContentType.x_www_form, min_length=1),
) -> ...:
Внутренний код Rapidy
StreamReader
from rapidy import StreamReader
@post('/')
async def handler(
user_data: StreamReader = Body(content_type=ContentType.x_www_form),
) -> ...:
Внутренний код Rapidy
Валидация Pydantic для StreamReader не поддерживается.
Значение по умолчанию для StreamReader задать нельзя.
Если попытаться установить значение по умолчанию для Body с аннотацией StreamReader через default или default_factory,
будет вызвана ошибка ParameterCannotUseDefaultError.