Text
Чтение тела запроса в качестве строки.
Описание
Text (MIME-type: text/*
) — это тип данных, представляющий собой строку.
Rapidy
работает с любым текстом, независимо от его subtype
.
Например: text/plain
, text/html
, text/css
, text/xml
, ...
, text/*
.
Определение кодировки
Для декодирования текста используется параметр charset
заголовка Content-Type
.
Если charset
не указан клиентом, текст будет декодирован в кодировке utf-8
.
from rapidy.http import post, Body, ContentType
@post('/')
async def handler(
text_data: str = Body(content_type=ContentType.text_plain),
# or
text_data: str = Body(content_type=ContentType.text_html),
# or any mime-type with type `text`
text_data: str = Body(content_type=ContentType.text_any),
) -> ...:
Отправка с помощью curl
Извлечение без валидации
Отключение валидации не рекомендуется.
Если валидация отключена, параметр будет содержать базовую структуру aiohttp
:
Body(content_type=ContentType.text_plain)
→str
Способы отключения валидации
Явное отключение
from enum import Enum
from rapidy.http import post, Body, ContentType
class DataEnum(Enum):
test = 'test'
@post('/')
async def handler(
data: DataEnum = Body(validate=False, content_type=ContentType.text_plain),
) -> ...:
Использование Any
Отсутствие аннотации типа
Значения по умолчанию
Если HTTP-запрос не содержит тела, параметр получит указанное значение по умолчанию (если оно задано).
Примеры использования
Указано значение по умолчанию
from enum import Enum
from rapidy.http import post, Body, ContentType
class DataEnum(Enum):
test = 'test'
@post('/')
async def handler(
data: DataEnum = Body('some_data', content_type=ContentType.text_plain),
# or
data: DataEnum = Body(default_factory=lambda: 'some_data', content_type=ContentType.text_plain),
) -> ...:
Опциональное тело запроса
from enum import Enum
from rapidy.http import post, Body, ContentType
class DataEnum(Enum):
test = 'test'
@post('/')
async def handler(
data: DataEnum | None = Body(content_type=ContentType.text_plain),
# or
data: Optional[DataEnum] = Body(content_type=ContentType.text_plain),
# or
data: Union[DataEnum, None] = Body(content_type=ContentType.text_plain),
) -> ...:
Извлечение сырых данных
Rapidy
использует метод text
объекта Request
для получения данных и передает их в Pydantic
для валидации.
Как происходит извлечение внутри Rapidy
Rapidy
использует встроенные механизмы aiohttp
Подробнее об объекте aiohttp.Request
и методах извлечения данных можно узнать
здесь.
Однако если параметр аннотирован как bytes
или StreamReader
, данные извлекаются иначе.
Подробнее об объекте StreamReader
можно узнать здесь.
bytes
@post('/')
async def handler(
user_data: bytes = Body(content_type=ContentType.text_plain),
# also you can use pydantic validation
user_data: bytes = Body(content_type=ContentType.text_plain, min_length=1),
) -> ...:
Внутренний код Rapidy
StreamReader
from rapidy import StreamReader
@post('/')
async def handler(
user_data: StreamReader = Body(content_type=ContentType.text_plain),
) -> ...:
Внутренний код Rapidy
Валидация Pydantic
для StreamReader
не поддерживается.
Значение по умолчанию для StreamReader
задать нельзя.
Если попытаться установить значение по умолчанию для Body
с аннотацией StreamReader
через default
или default_factory
, будет вызвана ошибка ParameterCannotUseDefaultError
.