--- title: Быстрый старт description: Объявите первый метод почтового SDK и получите типизированное письмо. sources: - eazy_sdk.api - eazy_sdk.Client - eazy_sdk.request - eazy_sdk.response api_fingerprint: "sha256:7d30eb68d809f5ece9e4eb2bf9c596f82205a4da38e3f07c315350b884a5afa1" --- Получим письмо `42` из учебного сервиса `mail.example`. Выберите библиотеку моделей, которую уже использует проект. Объявление HTTP-операции и вызов SDK во всех трёх вариантах одинаковы. Команды установки ниже относятся к вашему проекту. Команды запуска проверяют готовые файлы из репозитория Eazy SDK: клонируйте репозиторий и выполняйте их из его корня. Эти файлы подключены к локальному учебному сайту, поэтому не отправляют запросы во внешнюю сеть. :::::{tab-set} :sync-group: model-library ::::{tab-item} Pydantic :sync: pydantic Установите зависимости командой `uv add "eazy-sdk-core[httpx,pydantic]"`. ```{literalinclude} ../../../../../examples/mail/http/quickstart_pydantic.py :language: python :start-after: "# region docs: quickstart-pydantic" :end-before: "# endregion docs: quickstart-pydantic" ``` `Message` наследует `BaseModel` и запрещает изменение полей после проверки ответа. :::{dropdown} Файл примера целиком ```{literalinclude} ../../../../../examples/mail/http/quickstart_pydantic.py :language: python ``` ::: Запуск: `uv run python -m examples.mail.http.quickstart_pydantic`. ```text ada@mail.example: Планы на пятницу ``` :::: ::::{tab-item} dataclass :sync: dataclass Стандартной библиотеке нужен только HTTP-клиент: `uv add "eazy-sdk-core[httpx]"`. ```{literalinclude} ../../../../../examples/mail/http/quickstart_dataclass.py :language: python :start-after: "# region docs: quickstart-dataclass" :end-before: "# endregion docs: quickstart-dataclass" ``` `@dataclass(frozen=True, slots=True)` даёт неизменяемую модель без внешней зависимости. :::{dropdown} Файл примера целиком ```{literalinclude} ../../../../../examples/mail/http/quickstart_dataclass.py :language: python ``` ::: Запуск: `uv run python -m examples.mail.http.quickstart_dataclass`. ```text ada@mail.example: Планы на пятницу ``` :::: ::::{tab-item} msgspec :sync: msgspec Установите зависимости командой `uv add "eazy-sdk-core[httpx,msgspec]"`. ```{literalinclude} ../../../../../examples/mail/http/quickstart_msgspec.py :language: python :start-after: "# region docs: quickstart-msgspec" :end-before: "# endregion docs: quickstart-msgspec" ``` `msgspec.Struct` проверяет ответ и создаёт неизменяемый объект `Message`. :::{dropdown} Файл примера целиком ```{literalinclude} ../../../../../examples/mail/http/quickstart_msgspec.py :language: python ``` ::: Запуск: `uv run python -m examples.mail.http.quickstart_msgspec`. ```text ada@mail.example: Планы на пятницу ``` :::: ::::: ## Что произошло `GetMessage` хранит описание GET-запроса. Поле `message_id: Path[int]` принимает число от вызывающего кода и подставляет его в `/messages/{message_id}`. Тип `HttpOperation[Message]` выбирает модель успешного ответа. Библиотека моделей меняет только объявление `Message`. `MailApi` публикует операцию под именем `message` и задаёт адрес сервиса. Вызов `MailApi(client).message(message_id=42)` имеет ту же сигнатуру, что и класс `GetMessage`, поэтому редактор кода знает имя и тип аргумента до запуска программы. Функция `quickstart_client()` подключает пример к локальному учебному сайту из репозитория. В прикладном SDK приложение создаёт `Client`, а роутер получает его готовым. Выбор HTTPX, Requests или curl_cffi не меняет объявление операции. ## Следующий запрос Для POST добавьте поля тела с маркером `JsonField`. Вложенную структуру внешнего JSON собирает `BodyProjection`; вызывающему коду по-прежнему передаются обычные именованные аргументы. Эти механизмы разобраны в {doc}`руководстве по запросам `. Когда методов станет несколько, объедините роутеры в корень SDK. Дальше можно изучить {doc}`структуру запросов `, {doc}`HTTP-интеграции ` или {doc}`всё руководство `.