Как использовать прокси с OkHttp (Полное руководство 2026)
Краткое содержание
Прокси-сервер OkHttp настраивается в OkHttpClient.Builder, а не для отдельного Request. Используйте .proxy(proxy) для одного явного маршрута или оставьте его не установленным, чтобы дать proxySelector выбирать маршруты.
Аутентифицированные прокси требуют proxyAuthenticator, который отвечает на 407 вызов с помощью Proxy-Authorization. Остановитесь, если этот заголовок уже присутствует, чтобы предотвратить создание цикла аутентификации из-за неверных учетных данных.
Повторно используйте экземпляры OkHttpClient, а не создавайте один для каждого запроса. Небольшое количество заранее созданных клиентов обеспечивает предсказуемую ротацию конечных точек без потери пулов соединений и пулов потоков.
HTTPS все еще проходит через HTTP прокси, используя CONNECT. Поддерживайте проверку TLS, потому что прокси изменяет маршрут, а не требования к сертификату назначения.
Докажите маршрут перед масштабированием. Сравните наблюдаемый IP выхода, проверьте ответ и классифицируйте ошибки соединения с прокси отдельно от ошибок HTTP назначения.
Что такое прокси OkHttp?
Прокси OkHttp — это промежуточный сервер, выбранный OkHttpClient для исходящих HTTP и HTTPS соединений. Приложение отправляет трафик на прокси, который перенаправляет его к назначению и возвращает ответ. OkHttp все еще обрабатывает запросы, ответы, пуллинг, тайм-ауты и TLS; прокси управляет сетевым маршрутом и источником IP, видимым для назначения.
OkHttp использует модель Java java.net.Proxy. Текущий говорит, что явный имеет приоритет над . Если явный прокси не установлен, селектор может выбрать один из системной или прикладной политики. Передача принуждает к прямому соединению.
Эта стандартная конфигурация работает с внутренним шлюзом, отладочным прокси или управляемой конечной точкой, такой как Nstproxy Residential Prime Proxies. Прокси изменяет маршрутизацию; он не предоставляет разрешения на доступ к ресурсу или заменяет специфические для назначения ограничения по скорости и правила.
Зачем использовать прокси с OkHttp?
Прокси с OkHttp полезен, когда Java или Android приложение нуждается в контролируемом выходе, локализованном контроле качества, проверке рекламы, сборе публичных данных или разделении между классами трафика. Это также может сделать сетевую маршрутизацию воспроизводимой: код определяет выбранный маршрут, в то время как операции могут изменять конечную точку вне развертывания.
Модель сеанса должна следовать рабочему процессу. Несколько запросов, относящихся к одной сессии входа или покупки, могут нуждаться в стабильном маршруте, в то время как несвязанные проверки могут использовать ротацию. Обзор ротации IP Nstproxy объясняет эту сетевую схему; приложению все еще нужны ограниченные параллельные соединения, проверка ответов и лимиты повторных попыток.
OkHttp разработан для повторного использования клиентов. Повторное использование клиента сохраняет его пул соединений и ресурсы исполнителей. Если рабочие нагрузки требуют различных политик прокси, создайте небольшое количество долгоживущих клиентов — по одному на политику или конечную точку — вместо того, чтобы создавать новый клиент для каждого вызова.
Требования
Примеры требуют Java 8 или новее, Gradle, OkHttp 5.5.0, авторизованную конечную точку и хост и порт прокси. текущий репозиторий OkHttp указывает Java 8+ и Android 5.0+ в качестве поддерживаемых базовых версий, в то время как страница артефакта OkHttp в Maven Central предоставляет метаданные текущего релиза.
Храните значения прокси в среде с поддержкой секретного хранилища. Примеры читают PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASSWORD, и TARGET_URL. Избегайте ведения журналов учетных данных или полной аутентифицированной конечной точки.
<h1>Соединение OkHttp через Nstproxy</h1><pclass="description">Создайте аутентифицированную прокси-точку, затем прикрепите её к многоразовому OkHttpClient.</p><aclass="cta"href="https://app.nstproxy.com/auth/login?utm_source=official&utm_medium=blog&utm_campaign=/okhttp-proxy/"target="_blank"rel="noopener">Создать Java Прокси Маршрут</a></td><tdclass="visual-cell"><divclass="proxy-visual"aria-label="Схема соединения клиента через Nstproxy"><divclass="mode-pill"><svgclass="link-icon"viewBox="0 0 24 24"aria-hidden="true"><pathd="M10.6 13.4a1 1 0 0 0 1.4 1.4l3.5-3.5a3 3 0 0 0-4.2-4.2L9.5 8.9"fill="none"stroke="currentColor"stroke-width="1.8"stroke-linecap="round"/><pathd="M13.4 10.6a1 1 0 0 0-1.4-1.4l-3.5 3.5a3 3 0 0 0 4.2 4.2l1.8-1.8"fill="none"stroke="currentColor"stroke-width="1.8"stroke-linecap="round"/></svg> Липкие
</div><divclass="client-card"><divclass="monitor"></div><divclass="client-label">Клиент</div></div><spanclass="line-client"></span><divclass="nst-card"><svgclass="hex-logo"viewBox="0 0 64 64"aria-hidden="true"><pathd="M32 4 56 18v28L32 60 8 46V18Z"fill="none"stroke="#1e5eff"stroke-width="3"/><pathd="M23 43V21l18 22V21"fill="none"stroke="#1e5eff"stroke-width="3"stroke-linecap="round"stroke-linejoin="round"/></svg><divclass="nst-label">Nstproxy</div></div><spanclass="line-main"></span><spanclass="junction"></span><spanclass="country-rail"></span><spanclass="country-dot us"></span><spanclass="country-dot de"></span><spanclass="country-dot sg"></span><divclass="country-card us"><spanclass="flag">🇺🇸</span>США</div><divclass="country-card de"><spanclass="flag">🇩🇪</span>Германия</div><divclass="country-card sg"><spanclass="flag">🇸🇬</span>Сингапур</div></div></td></tr></table></section></main>
## Как использовать прокси с OkHttp
Существует три практических метода прокси для OkHttp: прикрепить один явный прокси, ответить на запрос аутентификации прокси или переключаться между пулом многоразовых клиентов. Каждый Java-пример ниже был скомпилирован и выполнен с OkHttp 5.5.0 против специально созданного локального прокси. Тесты подтвердили абсолютные HTTP-запросы, успешную повторную аутентификацию 407 и детерминированную маршрутизацию через две конечные точки.
### Метод 1: Настроить один явный прокси
Используйте явный прокси, когда каждый запрос от одного клиента должен следовать одному и тому же маршруту. Создайте Java `Proxy`, прикрепите его к сборщику и задайте время соединения и общее время вызова.
```java
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.time.Duration;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public final class BasicProxy {
public static void main(String[] args) throws Exception {
String proxyHost = requireEnv("PROXY_HOST");
int proxyPort = Integer.parseInt(requireEnv("PROXY_PORT"));
String targetUrl = System.getenv().getOrDefault(
"TARGET_URL", "https://httpbin.org/ip");
Proxy proxy = new Proxy(
Proxy.Type.HTTP,
new InetSocketAddress(proxyHost, proxyPort));
OkHttpClient client = new OkHttpClient.Builder()
.proxy(proxy)
.connectTimeout(Duration.ofSeconds(5))
.callTimeout(Duration.ofSeconds(15))
.build();
Request request = new Request.Builder().url(targetUrl).build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IllegalStateException("Неожиданный статус: " + response.code());
}
System.out.println(response.body().string());
}
}
private static String requireEnv(String name) {
String value = System.getenv(name);
if (value == null || value.isBlank()) {
throw new IllegalArgumentException(name + " обязательный");
}
return value;
}
}
Выполненный тест вернул HTTP 200 и показал GET http://example.test/ip HTTP/1.1 на локальном прокси. Для целевого HTTPS OkHttp сначала запрашивает HTTP-прокси на создание туннеля с помощью CONNECT и затем выполняет TLS с конечной точкой через этот туннель. Не отключайте проверку сертификатов, чтобы решить проблему маршрутизации или локального CA.
Метод 2: Добавить аутентификацию прокси с использованием имени пользователя и пароля
Используйте proxyAuthenticator, когда конечная точка требует базовой аутентификации прокси. Аутентификатор запускается после того, как прокси возвращает 407 Proxy Authentication Required; он должен добавить учетные данные один раз и остановиться, если тот же запрос уже имеет заголовок.
public final class AuthenticatedProxy {
public static void main(String[] args) throws Exception {
String proxyHost = requireEnv("PROXY_HOST");
int proxyPort = Integer.parseInt(requireEnv("PROXY_PORT"));
String proxyUser = requireEnv("PROXY_USER");
String proxyPassword = requireEnv("PROXY_PASSWORD");
String targetUrl = System.getenv().getOrDefault(
"TARGET_URL", "https://httpbin.org/ip");
Proxy proxy = new Proxy(
Proxy.Type.HTTP,
new InetSocketAddress(proxyHost, proxyPort));
OkHttpClient client = new OkHttpClient.Builder()
.proxy(proxy)
.proxyAuthenticator((route, response) -> {
if (response.request().header("Proxy-Authorization") != null) {
return null;
}
String credential = Credentials.basic(proxyUser, proxyPassword);
return response.request().newBuilder()
.header("Proxy-Authorization", credential)
.build();
})
.connectTimeout(Duration.ofSeconds(5))
.callTimeout(Duration.ofSeconds(15))
.build();
Request request = new Request.Builder().url(targetUrl).build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IllegalStateException("Неожиданный статус: " + response.code());
}
System.out.println(response.body().string());
}
}
private static String requireEnv(String name) {
String value = System.getenv(name);
if (value == null || value.isBlank()) {
throw new IllegalArgumentException(name + " требуется");
}
return value;
}
}
Прокси для верификации намеренно вернул 407 по первому запросу. OkHttp вызвал аутентификатор, повторил запрос один раз, и прокси подтвердил, что второй запрос содержал действительную авторизацию. Ограциающий цикл важен: возвращение другого запроса после того, как учетные данные уже провалились, может повторять вызовы, пока не будет достигнут лимит последующих запросов OkHttp.
Учетные данные прокси отличаются от учетных данных назначения. Используйте `proxyAuthenticator` для вызова 407 прокси и `authenticator` для вызова 401 сервера источника. Никогда не отправляйте `Proxy-Authorization` в качестве обычного заголовка назначения.
### Метод 3: Ротация пула прокси-эндпоинтов
Используйте предварительно собранные клиенты, когда приложение должно выбирать из нескольких различных конечных точек. Этот пример поддерживает один многоразовый клиент на конечную точку и выбирает их по кругу. Ротация со стороны поставщика через один шлюз обычно проще; ротация со стороны клиента полезна, когда идентичность и состояние конечной точки должны оставаться видимыми для приложения.
```java
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public final class RotatingProxy {
private final List<OkHttpClient> clients;
private final AtomicInteger next = new AtomicInteger();
private RotatingProxy(List<InetSocketAddress> endpoints) {
this.clients = new ArrayList<>();
for (InetSocketAddress endpoint : endpoints) {
Proxy proxy = new Proxy(Proxy.Type.HTTP, endpoint);
clients.add(new OkHttpClient.Builder()
.proxy(proxy)
.connectTimeout(Duration.ofSeconds(5))
.callTimeout(Duration.ofSeconds(15))
.build());
}
}
private OkHttpClient nextClient() {
return clients.get(Math.floorMod(next.getAndIncrement(), clients.size()));
}
public static void main(String[] args) throws Exception {
String proxyHost = requireEnv("PROXY_HOST");
String[] ports = requireEnv("PROXY_PORTS").split(",");
String targetUrl = System.getenv().getOrDefault(
"TARGET_URL", "https://httpbin.org/ip");
List<InetSocketAddress> endpoints = new ArrayList<>();
for (String port : ports) {
endpoints.add(new InetSocketAddress(proxyHost, Integer.parseInt(port.trim())));
}
if (endpoints.size() < 2) {
throw new IllegalArgumentException("Не менее двух прокси-портов требуется");
}
RotatingProxy pool = new RotatingProxy(endpoints);
Request request = new Request.Builder().url(targetUrl).build();
for (int i = 0; i < endpoints.size(); i++) {
try (Response response = pool.nextClient().newCall(request).execute()) {
if (!response.isSuccessful()) {
// Код продолжения будет здесь
private static String requireEnv(String name) {
String value = System.getenv(name);
if (value == null || value.isBlank()) {
бросить новое IllegalArgumentException(name + " обязателен");
}
return value;
}
}
Живой запуск сообщил о прокси-портах `18180` и `18182` в таком порядке. В производственной среде храните не секретный идентификатор конечной точки рядом с каждым клиентом, фиксируйте успех и задержку по идентификатору и временно помещайте в карантин конечные точки, которые повторно неудачны. Не выводите URL конечной точки, если он содержит учетные данные.
## Явный прокси против ProxySelector
Используйте `.proxy(proxy)` для фиксированной политики клиента и `proxySelector` для маршрутизации с учетом назначения. Селектор может возвращать разные значения Java `Proxy` для разных URI и получать уведомления о `connectFailed`. Документация JDK <a href="https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/net/Proxy.html" rel="nofollow noopener"><strong>java.net.Proxy documentation</strong></a> определяет представления HTTP, SOCKS и прямого прокси.
Не настраивайте оба параметра и не ожидайте, что они будут объединены. OkHttp обращается к `proxySelector` только когда явный прокси равен null. Если службе необходимо обойти прокси для внутренних хостов, создайте прямой клиент или реализуйте селектор, чей метод `select(URI)` возвращает `Proxy.NO_PROXY` для этих хостов. Это яснее, чем полагаться на не замеченную настройку для всего устройства.
`ProxySelector` может предоставить резервные маршруты, но это не является автоматически ротационным механизмом для каждого запроса. Повторное использование соединений и восстановление маршрутов влияют на то, какой маршрут используется. Используйте шлюз провайдера для ротации на уровне сети или специализированный пул клиентов, когда каждое обращение приложения должно иметь аудируемый выбор конечной точки.
## Как проверить прокси OkHttp
Проверьте прокси OkHttp, проверив маршрут и ответ вместе. Отправьте один прямой запрос и один проксированный запрос к авторизованной конечной точке отражения IP, затем сравните отчетные исходные адреса. Успешный статус сам по себе не доказывает, что прокси обработал вызов.
Проверьте статус ответа, тип содержимого и обязательные поля тела. Промежуточный шлюз или конечное устройство могут вернуть HTML-страницу с блоком с HTTP 200. Глоссарий [HTTP запросов](https://www.nstproxy.com/glossary/http-request) является полезной справкой для границы запроса/ответа.
Затем протестируйте режимы отказа. Используйте неверный порт, чтобы подтвердить тайм-аут подключения, неверные учетные данные, чтобы подтвердить ограниченный результат 407, и медленную авторизованную цель, чтобы подтвердить тайм-аут вызова. Слушатели событий OkHttp могут записывать DNS, подключение, TLS и время ответа, не раскрывая секретов. Для представления этого же маршрута на другом языке, [руководство по прокси Guzzle](https://www.nstproxy.com/blog/guzzle-proxy) предлагает полезную проверку.
## Выбор маршрута Nstproxy для OkHttp
Прожекторы Nstproxy Residential Prime подходят для приложений OkHttp, которым нужен авторизованный жилой маршрут с контролем сессий и местоположения, обеспечиваемыми текущим рабочим процессом продукта. Java требует только стандартного хоста, порта, имени пользователя и пароля; какой-либо специфический для вендора SDK не требуется для самого соединения с прокси. Ознакомьтесь с [действующими тарифными моделями Residential Prime](https://www.nstproxy.com/pricing/residential) и протестируйте точную цель, прежде чем выбрать маршрут для производства.
- **Предпочитайте один шлюз, когда провайдер обрабатывает ротацию.** Это сохраняет небольшую конфигурацию OkHttp и сохраняет повторное использование клиента.
- **Используйте липкое поведение для многозапросных сессий.** Держите связанные вызовы на одном маршруте в требуемый временной промежуток сессии.
- **Используйте пул приложений только тогда, когда необходим контроль на уровне конечной точки.** Добавьте отслеживание состояния, ограниченные повторы и не секретные идентификаторы маршрута перед увеличением параллелизма.
Приложение Android может использовать те же API сборки OkHttp, но отправка долгоживущих учетных данных прокси внутри мобильного бинарного файла рискованна. Предпочитайте краткосрочные учетные данные или серверный сетевой уровень, когда это возможно. См. [обзор серверов прокси для Android](https://www.nstproxy.com/blog/best-proxy-server-for-android) для альтернатив на уровне платформы.
## Общие ошибки прокси OkHttp и их исправления
Ошибки прокси OkHttp легче исправить, когда уровень соединения отделен от ответа назначения.
| Симптом | Вероятная причина | Практическое исправление |
|---|---|---|
| `407 Требуется аутентификация прокси` | Отсутствие или отклоненные учетные данные прокси | Подтвердите имя пользователя/пароль, используйте `proxyAuthenticator` и прекращайте после того, как заголовок уже был проверен. |
| Тайм-аут подключения или `ConnectException` | Неверный хост/порт, недоступный маршрут или политика сети | Проверьте конечную точку и сохраняйте короткий `connectTimeout`; не пытайтесь повторно подключаться бесконечно. |
| Ошибка рукопожатия TLS | Неверная конфигурация доверия, перехват или несоответствие имени хоста | Исправьте CA или маршрут; поддерживайте проверку сертификата и имени хоста включенной. |
| Проксирование, похоже, не используется | Явный `Proxy.NO_PROXY`, политика селектора или другой клиент обработал вызов | Запишите не секретный клиентский/маршрутный идентификатор и сравните результаты прямого и проксированного выхода IP. |
| `403` или `429` | Получатель отклонил или ограничил запрос | Уменьшите скорость запросов, подтвердите авторизацию и следуйте правилам получателя. |
| Повторные попытки 407 | Аутентификатор возвращает новый запрос после неудачной попытки ввода учетных данных | Верните `null`, если заголовок `Proxy-Authorization` уже присутствует. |
Повторяйте только временные сбои и используйте задержку. Для запросов, изменяющих состояние, добавьте защиту идемпотентности перед повторной попыткой. Новый прокси IP не может превратить недействительный запрос в действительный.
## Заключение
Самый простой способ настройки прокси в OkHttp — это явный `Proxy` для одного стабильного маршрута, `proxyAuthenticator` для вызова 407, или небольшой пул переиспользуемых клиентов для подлежащей аудиту ротации конечных точек. Храните учетные данные вне исходного кода, используйте ограниченные тайм-ауты, соблюдайте проверку TLS и подтверждайте как выходной маршрут, так и семантику ответа.
Начните с одного авторизованного получателя и одной конечной точки. Запишите успешную базу, затем добавьте ротацию или логику выбора только тогда, когда приложение сможет определить неудачные маршруты и принять обоснованное решение о резервировании.
## Опыт Nstproxy — Начните свой бесплатный пробный период сегодня
Создайте аутентифицированную конечную точку, подключите одного переиспользуемого клиента OkHttp и проверьте наблюдаемый маршрут перед масштабированием.
<a style="margin: 8px; display: inline-block; text-decoration: none; border-left-width: 0px;" href="https://app.nstproxy.com/auth/login?utm_source=official&utm_medium=blog&utm_campaign=/okhttp-proxy/">
<div style="font-weight:bold; max-width:400px; padding:12px 40px; background:#646AEE; border-radius:5px; border:2px solid #646AEE; color:#fff; font-size:18px;">
Попробуйте Nstproxy бесплатно →
</div>
</a>
## Часто задаваемые вопросы
**В: Как установить прокси в OkHttp?**
Создайте `java.net.Proxy` с типом прокси и `InetSocketAddress`, затем передайте это в `new OkHttpClient.Builder().proxy(proxy).build()`. Повторно используйте полученный клиент для вызовов, которые используют этот маршрут.
**В: Как добавить имя пользователя и пароль прокси в OkHttp?**
Настройте `proxyAuthenticator` и верните последующий запрос, содержащий `Proxy-Authorization`, обычно создаваемый с помощью `Credentials.basic(user, password)`. Верните `null`, если этот заголовок уже присутствует, чтобы избежать повторных неудачных попыток.
**В: Поддерживает ли OkHttp HTTPS через HTTP-прокси?**
Да. OkHttp использует метод HTTP CONNECT для создания туннеля через прокси, а затем выполняет TLS с конечной точкой. Маршрут прокси не оправдывает отключение проверки сертификатов или имен хостов.
**В: Явный прокси OkHttp переопределяет ProxySelector?**
Да. Явная настройка `proxy` в OkHttp имеет приоритет; `proxySelector` запрашивается только в том случае, если явный прокси равен null. Используйте `Proxy.NO_PROXY`, когда клиент всегда должен подключаться напрямую.
**В: Должен ли я создавать новый OkHttpClient для каждого ротационного запроса?**
Нет. Создайте ограниченный набор переиспользуемых клиентов — по одному на конечную точку или политику маршрутизации — и выбирайте среди них. Это сохраняет пулы подключения и избегает повторного создания ресурсов исполнителя.
Ivy Lin
Aug. 20th 2026
110M+ реальных IP с 99.9% успешных доступов
Средний отклик ~0.5с для задач высокой конкуренции
Всего от $0.1/GB
Мгновенный доступ к премиальным residential, datacenter, IPv6 и ISP пулам.