--- title: Выбор варианта ответа description: Узнайте, как статус, тип данных и содержимое выбирают типизированный исход. sources: - eazy_sdk.response.Responses - eazy_sdk.response.ResponseContext - eazy_sdk.UnexpectedResponseError api_fingerprint: "sha256:ca5c96d6bce958d51b661c37a3eedfe9d33d7d1f6bcd1444037540acf5d765c5" --- Как ответ получает один типизированный исход? `Responses` рассматривает ответ как набор объявленных успешных и ошибочных вариантов. Сначала он отбирает кандидатов по статусу, типу данных и условию `when`, затем читает тело только через их парсеры или экстракторы ([`eazy_sdk.response.cases`](https://github.com/0cherednoq/eazy-sdk/blob/master/eazy_sdk/response/cases.py)). ```{mermaid} flowchart TD Response["NormalizedResponse"] --> Filter["Статус + media type + when"] Filter -->|нет кандидатов| Fallback["Fallback или Unexpected"] Filter --> Parse["Извлечь и разобрать тело"] Parse --> Accept["accept или теги модели"] Accept --> Rank["Выбрать самый специфичный case"] Rank --> Success["SuccessOutcome"] Rank --> Error["ErrorOutcome"] Rank --> Ambiguous["AmbiguousResponseOutcome"] Parse --> Malformed["MalformedOutcome"] ``` ## Приоритет вариантов Если тело приняли несколько вариантов, побеждает более узкое объявление. Порядок сравнения: 1. Вариант с критерием перед вариантом без критерия. Критерий задают `when=`, `accept=`, `Const(...)` на поле модели и `Location(...)` на поле, которое не допускает `None`. 2. Точный статус перед диапазоном, диапазон перед `DEFAULT`. 3. Точный тип данных перед шаблоном, шаблон перед отсутствующим ограничением. 4. Операция перед сервисом, сервис перед клиентом. Полное равенство остаётся неоднозначностью, потому что декларация не даёт основания выбрать один вариант ([`_most_specific`](https://github.com/0cherednoq/eazy-sdk/blob/master/eazy_sdk/response/cases.py)). `ResponseContext` лениво предоставляет байты, текст, JSON, заголовки и cookies. Один разобранный артефакт кешируется и используется всеми конкурирующими вариантами ответа ([`ResponseContext`](https://github.com/0cherednoq/eazy-sdk/blob/master/eazy_sdk/response/cases.py)). Статус перехода, на который операция объявила вариант, принадлежит операции: `Responses.declares(status)` отвечает исполнителю, и тот не следует `Location` сам. Запасной вариант `fallback=` статус не объявляет. `unwrap()` успешного исхода возвращает значение. Ошибочный исход создаёт объявленный `ApiError`, а неожиданный, повреждённый и неоднозначный ответы получают отдельные типы ошибок ([`ResponseOutcome`](https://github.com/0cherednoq/eazy-sdk/blob/master/eazy_sdk/response/cases.py)). ## Дальше - {doc}`Объявить успешный ответ ` - {doc}`Объявить ошибку API ` - {doc}`Подключить свой парсер `