Обработать 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 |
Тело |
|---|---|---|
|
По redirect policy |
Обычно удаляется при переходе на |
|
|
Удаляется |
|
Сохраняется |
Требует 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(...) каждый шаг перехода получает куки, которые поставили
предыдущие шаги, и только те, что предназначены его хосту.
Клиент следует только тем переходам, на статус которых операция не объявила случай. Если исход вызова записан в адресе перехода, объявите его в операции, и ответ достанется ей. Подробнее об этом рассказывает руководство о чтении исхода из адреса перехода.