---
metadata:
  - name: generator
    content: Diplodoc Platform v5.64.2
alternate:
  - https://ytsaurus.tech/docs/en/flow/python/http-client.md
  - https://ytsaurus.tech/docs/ru/flow/python/http-client.md
  - href: https://ytsaurus.tech/docs/ru/flow/python/http-client.md
    type: text/markdown
    title: Markdown version
  - href: https://ytsaurus.tech/docs/ru/llms.txt?revision=827ae6f9747f49afc4a4326edf00597a1e92428f
    rel: describedby
---
> **Documentation Index:** Fetch the complete configuration index at https://ytsaurus.tech/docs/ru/llms.txt?revision=827ae6f9747f49afc4a4326edf00597a1e92428f

# Общие HTTP-клиенты в Python

Обработчики Python могут отправлять HTTP-запросы через `ctx.http_client` и `ctx.https_client`. Companion создаёт эти экземпляры `HttpClient` с пулами соединений один раз на процесс и предоставляет их всем обслуживающим потокам и компьютейшенам. Методы жизненного цикла ресурсов получают те же клиенты через `ResourceContext`.

Используйте клиенты после настройки [Python companion](https://ytsaurus.tech/docs/ru/flow/python/getting-started.md). Поддерживаемые примеры запросов находятся в [локальных HTTP-тестах](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/library/python/companion/test/test_http_client.py): они проверяют GET, POST, тела ответов, коды состояния, cookie и перенаправления.

## API запросов {#requests}

`HttpClient.request(method, url, *, headers=None, params=None, data=None, json=None, timeout=None)` возвращает `HttpResponse`. Методы `get`, `post`, `put`, `patch`, `delete` и `head` принимают URL и те же именованные аргументы.

#|
|| **Аргумент** | **Назначение** ||
|| `headers` | Заголовки запроса в виде словаря. ||
|| `params` | Параметры строки запроса в виде словаря. ||
|| `data` | Тело запроса, передаваемое клиенту Requests. ||
|| `json` | Значение для сериализации в JSON-тело запроса. ||
|| `timeout` | Число секунд или пара `(connect_timeout, read_timeout)` в секундах. Без переопределения таймаут соединения составляет 10 секунд, а чтения — 60 секунд. Это не общий срок выполнения запроса. ||
|#

Передавайте параметры отдельного запроса при вызове. Не изменяйте состояние общего клиента из компьютейшена или ресурса.

## Ответы и ошибки {#responses}

`HttpResponse` предоставляет следующие поля и методы:

#|
|| **Поле или метод** | **Результат** ||
|| `status_code` | Целочисленный HTTP-код состояния. ||
|| `ok` | Признак отсутствия HTTP-ошибки (4xx или 5xx). Ответ с перенаправлением тоже может иметь `ok = True`. ||
|| `url` | Конечный URL ответа после выполненных перенаправлений. ||
|| `headers` | Заголовки ответа в виде словаря. ||
|| `content` | Тело ответа в виде `bytes`. ||
|| `text` | Декодированное тело ответа. ||
|| `json(**kwargs)` | Тело ответа, декодированное как JSON; именованные аргументы передаются декодеру. ||
|#

HTTP-код ошибки не вызывает исключение: проверяйте `status_code` или `ok`. Ошибки выполнения запроса и декодирования JSON передаются вашему коду. Обёртка не добавляет цикл повторных запросов; явно выберите правила повторов и идемпотентности для внешнего сервиса.

Клиенты не сохраняют cookie из ответов и не отправляют их автоматически в следующих запросах. По умолчанию перенаправления отключены: ответ 3xx возвращается напрямую. Положительное значение `max_redirect_count` разрешает переходы в пределах заданного лимита; превышение лимита вызывает исключение клиента.

## Конфигурация {#configuration}

Блок `companion` в конфигурации узла-воркера задаёт `http_client_config` и `https_client_config`. Воркер передаёт эти блоки процессу Python через `YT_FLOW_COMPANION_CONFIG`; из каждого блока Python создаёт отдельный клиент. Схема на стороне воркера описана в [TCompanionConfig](https://ytsaurus.tech/docs/ru/flow/generated_docs/all_yson_structs.md#NYT_NFlow_NCompanion_TCompanionConfig).

Python-обёртка читает из каждого блока следующие ключи:

#|
|| **Ключ** | **Поведение Python** ||
|| `max_idle_connections` | Размер пула соединений. Если значение не задано или равно `0`, используется `8`; положительное значение задаёт размер пула. ||
|| `max_redirect_count` | По умолчанию `0`: переходы по перенаправлениям отключены. Положительное значение задаёт их лимит. ||
|#

Остальные поля конфигурации HTTP/HTTPS-клиентов C++ эта Python-обёртка не применяет. В частности, таймаут Python-запроса задаётся аргументом `timeout`; поля таймаутов C++ его не заменяют. Размеры пулов не ограничивают число одновременно выполняемых запросов.

## Доступность в тестах и встроенном коде {#availability}

`HttpClient`, `HttpClients` и `HttpResponse` экспортируются из `yt.yt.flow.library.python.companion`. Можно создать `HttpClient()` с настройками по умолчанию или передать словарь поддерживаемых параметров.

Контекст выполнения, созданный вне обслуживающего кода companion, не получает клиенты автоматически. Чтение `ctx.http_client` или `ctx.https_client` без передачи клиентов вызывает `ValueError`. Тесты, которые создают контексты самостоятельно, должны передавать клиенты явно; см. [тесты передачи клиентов в контекст](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/library/python/companion/test/test_http_client.py).

## Исходный код и тесты {#source-and-tests}

- [Реализация HTTP-клиента](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/library/python/companion/http_client.py).
- [Контекст выполнения](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/library/python/companion/context.py) и [передача клиентов при обработке батча](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/library/python/companion/service.py).
- [Локальные тесты HTTP и конфигурации](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/library/python/companion/test/test_http_client.py).
- [Интеграционные HTTP-тесты companion](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/tests/companion/http_client/python/test/test_http_client_python.py).
