NP NEONPROXYPROXY NETWORK
КупитьЦеныFAQПартнёркаБлог Прокси-чекерМой IPAPI TG-бот

Прокси в Java HttpClient

Начиная с Java 11, класс java.net.http.HttpClient заменяет устаревший HttpURLConnection для большинства HTTP/2 задач. Прокси NEONPROXY в формате host:port:login:password подключается через ProxySelector и Authenticator. Ниже — минимальные примеры для HTTPS-прокси; для SOCKS5 потребуется JVM с поддержкой или библиотека типа jsocks.

HTTPS-прокси: базовый пример

import java.net.*; import java.net.http.*; import java.io.IOException; import java.time.Duration; public class NeonProxyDemo { public static void main(String[] args) throws IOException, InterruptedException { String host = "185.22.34.89"; int port = 8080; String user = "java_u"; String pass = "java_p"; ProxySelector selector = ProxySelector.of( new InetSocketAddress(host, port) ); Authenticator auth = new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user, pass.toCharArray()); } }; HttpClient client = HttpClient.newBuilder() .proxy(selector) .authenticator(auth) .connectTimeout(Duration.ofSeconds(15)) .build(); HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://api.ipify.org?format=json")) .GET() .build(); HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandlers.ofString()); System.out.println(resp.body()); } }

Ответ JSON должен содержать IP прокси. Сверьте с /tools/myip/.

SVYAZVPN — свобода без границ

Системные свойства JVM

java -Dhttp.proxyHost=185.22.34.89 \ -Dhttp.proxyPort=8080 \ -Dhttps.proxyHost=185.22.34.89 \ -Dhttps.proxyPort=8080 \ -Dhttp.proxyUser=java_u \ -Dhttp.proxyPassword=java_p \ -Djdk.http.auth.tunneling.disabledSchemes= \ -Djdk.http.auth.proxying.disabledSchemes= \ -jar myapp.jar

С Java 8u111 по умолчанию отключена Basic auth для туннеля — последние два флага её включают. Для production лучше явный HttpClient в коде, а не глобальные system properties.

Асинхронные запросы и пул

HttpClient client = HttpClient.newBuilder() .proxy(ProxySelector.of(new InetSocketAddress(host, port))) .authenticator(auth) .executor(Executors.newFixedThreadPool(8)) .build(); CompletableFuture<HttpResponse<String>> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofString()); future.thenAccept(r -> System.out.println(r.statusCode()));

Для ротации нескольких прокси NEONPROXY реализуйте custom ProxySelector, возвращающий следующий InetSocketAddress из списка — паттерн как в ротации прокси.

Отладка и SSL

IOException: HTTP/1.1 header parser received status line: HTTP/1.1 407 — неверные credentials. Проверьте прокси в чекере до запуска JVM. Для legacy-кода на Apache HttpClient 4.x синтаксис другой — но принцип тот же: HostConfiguration + CredentialsProvider.

Go- и Node-аналоги — в статьях Go net/http и Node.js Axios.

HttpClient и HTTP/2

HttpClient по умолчанию пробует HTTP/2 — некоторые legacy-прокси ведут себя иначе на h2. При странных ошибках принудите HTTP/1.1:

HttpClient client = HttpClient.newBuilder() .proxy(selector) .authenticator(auth) .version(HttpClient.Version.HTTP_1_1) .build();

Spring Boot и RestTemplate

В Spring 6+ рекомендуется WebClient на Reactor Netty. Прокси задаётся через HttpClient.create().proxy(...) в connector. Для RestTemplate используйте SimpleClientHttpRequestFactory с setProxy — но лучше мигрировать на HttpClient API.

Таймауты и connection pool

HttpClient переиспользует соединения — при ротации прокси создавайте отдельный client на каждый ProxySelector или вызывайте client.close() (Java 21+) между сменами. Задайте connectTimeout и ограничьте Executor, чтобы не исчерпать threads при медленном прокси.

Тестируйте интеграцию в CI с реальным NEONPROXY из secrets — mock не поймает 407 и DNS-утечки. Проверка IP: тот же запрос к api.ipify.org и сверка с чекером.

OkHttp как альтернатива

На Android и в legacy-проектах часто встречается OkHttp — прокси задаётся через Proxy и Authenticator аналогично HttpClient. Для единообразия вынесите парсинг host:port:login:password в общий модуль конфигурации.

OkHttpClient client = new OkHttpClient.Builder() .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port))) .proxyAuthenticator((route, response) -> response.request().newBuilder() .header("Proxy-Authorization", Credentials.basic(user, pass)) .build()) .build();

HttpClient из java.net.http предпочтительнее для новых сервисов на Java 17+ — меньше зависимостей и нативная HTTP/2.

В Kubernetes sidecar-контейнер с tinyproxy может централизовать auth NEONPROXY для всех pod'ов — Java-приложение тогда ходит на localhost:3128 без пароля. Для serverless (Lambda) системные properties JVM не всегда доступны — задавайте HttpClient в static initializer из env SECRET.

Итог: HttpClient.newBuilder().proxy().authenticator() — каноничный способ для Java 11+. Парсите host:port:login:password из конфига и проверяйте egress IP перед деплоем.

Для Kotlin coroutines используйте тот же HttpClient в suspend-обёртках; не создавайте новый client на каждый запрос — переиспользуйте singleton с настроенным ProxySelector и пулом NEONPROXY.

Добавьте integration-тест, который читает NEONPROXY_URL из env, парсит четыре поля host:port:login:password и assert'ит, что api.ipify.org возвращает не localhost — тест ловит misconfiguration до релиза.

Документируйте в README сервиса переменные HTTP_PROXY и формат строки NEONPROXY — onboarding новых разработчиков займёт минуты вместо часов отладки 407.

Сверяйте egress IP после каждого деплоя через /tools/myip/ — misconfigured proxy в production часто остаётся незамеченным до первого инцидента с whitelist.

← Все статьи блога

Готовы начать

Прокси для Java-сервисов

Стабильные IPv4 для микросервисов — host:port:login:password, HTTPS и SOCKS5.

Перейти к заказу