Обработать HTTP redirect#

Отключите автоматические redirects у transport adapter. Тогда Eazy SDK проверит лимит, область credentials и безопасность повторной отправки перед переходом.

# examples/docs/reliability_redirect.py
def main() -> None:
    site = GuideSite()
    with guide_client(site) as client:
        operation = RedirectApi(client).get
        result = operation.send(
            operation.request(),
            options=CallOptions(max_attempts=2, max_redirects=1),
        )
    print(f"result: {result.value}")
    print(*site.calls, sep="\n")
Файл целиком
"""Follow a redirect inside the SDK attempt loop."""

from dataclasses import dataclass

from pydantic import BaseModel

from eazy_sdk import Http, HttpOperation, SyncApi, op
from eazy_sdk.clients import CallOptions
from examples.docs.guide_site import GuideSite, guide_client


class Result(BaseModel):
    value: str


@dataclass(frozen=True, slots=True, kw_only=True)
class GetRedirected(HttpOperation[Result]):
    __http__ = Http.get("/redirect")


class RedirectApi(SyncApi):
    get = op(GetRedirected)


# region docs: reliability-redirect
# examples/docs/reliability_redirect.py
def main() -> None:
    site = GuideSite()
    with guide_client(site) as client:
        operation = RedirectApi(client).get
        result = operation.send(
            operation.request(),
            options=CallOptions(max_attempts=2, max_redirects=1),
        )
    print(f"result: {result.value}")
    print(*site.calls, sep="\n")
# endregion docs: reliability-redirect


if __name__ == "__main__":
    main()
result: redirected
GET api.mail.example/redirect
GET api.mail.example/final

Статус

Следующий method

Тело

301, 302

По redirect policy

Обычно удаляется при переходе на GET

303

GET

Удаляется

307, 308

Сохраняется

Требует replay-safe body

Каждый переход повторно применяет scoped middleware, авторизацию, подготовку и подпись. Неожиданный authority не получает credentials автоматически. Исчерпание max_redirects приводит к RedirectLimitError.

Resilience(max_redirects=N, client_redirects=True) добавляет к статусам переход, записанный в странице тегом <meta http-equiv="refresh">. Он выполняется запросом GET, расходует тот же запас и срабатывает, только если страницу не приняла ни одна модель операции. Тег внутри <noscript>, задержка больше пяти секунд и адрес самой страницы переходом не считаются. Переход через window.location требует исполнения скрипта и клиентом не выполняется.

На сайте с объявленными Cookies(...) каждый шаг перехода получает куки, которые поставили предыдущие шаги, и только те, что предназначены его хосту.

Клиент следует только тем переходам, на статус которых операция не объявила случай. Если исход вызова записан в адресе перехода, объявите его в операции, и ответ достанется ей. Подробнее об этом рассказывает руководство о чтении исхода из адреса перехода.

Дальше#