Запрос OkHttp не имеет общего изменяемого поля прокси. Выберите клиент с нужным маршрутом до создания его вызова.

Когда остальная конфигурация должна оставаться общей, получите маршрутизированный клиент из существующего клиента:

OkHttpClient routed = baseClient.newBuilder()
    .proxy(new Proxy(Proxy.Type.HTTP,
        new InetSocketAddress("203.0.113.10", 8080)))
    .build();

Конечная точка приведена лишь для примера. Публичные HTTP-точки из списка HTTP-прокси могут заполнить этот адрес сокета для разрешённого маршрута публичной службы при условии, что политика базового клиента не передаёт новых учётных данных прокси новой конечной точке. OkHttp документирует, что newBuilder разделяет ресурсы пула соединений и потоков с исходным клиентом. Это не означает, что сокет, установленный через один прокси, можно переименовать в другой маршрут. Пригодность соединения по-прежнему зависит от конфигурации маршрута и адреса.

Для повторяющейся работы храните ограниченный набор клиентов с ключами по действительно нужной вам политике маршрутизации. Избегайте неограниченной карты, ключи которой содержат все когда-либо замеченные временные учётные записи или вариации прокси.

Совместное использование ресурсов влияет и на завершение работы. Закрытие общего кэша или остановка общего диспетчера может повлиять на другие производные клиенты, использующие эти ресурсы. Задайте владению ресурсами понятное время жизни на уровне приложения, вместо того чтобы считать каждый производный клиент изолированным сетевым стеком.

Наконец, включите идентичность выбранного прокси в собственные метаданные вызова. Глобальная переменная «последний выбранный прокси» не позволяет определить маршрут нескольких одновременных запросов.

Похожие статьи