Использование HTTP-прокси в Java HttpClient
Передайте ProxySelector в построитель HTTP-клиента Java и разделяйте тайм-ауты подключения и запроса.
В Java 11 и новее задайте ProxySelector в построителе клиента. Это не меняет свойства прокси для всей JVM:
import java.net.InetSocketAddress;
import java.net.ProxySelector;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class ProxyExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.proxy(ProxySelector.of(
new InetSocketAddress("203.0.113.10", 8080)))
.connectTimeout(Duration.ofSeconds(5))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/"))
.timeout(Duration.ofSeconds(15))
.GET()
.build();
HttpResponse<String> response = client.send(
request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}Замените документационную точку своим HTTP-прокси; список HTTP-прокси даёт кандидатов для проверки. ProxySelector.of принимает адрес сокета: используйте хост без префикса http:// и передавайте порт отдельно. Выбирается HTTP-прокси, а не SOCKS по номеру порта. URI запроса остаётся настоящим назначением.
HTTPS может проходить через этот HTTP-прокси по туннелю. Понижать защищённость назначения не нужно, а настройка не означает поддержку TLS самим слушателем прокси.
Тайм-аут подключения в построителе действует при установлении соединения; у запроса есть собственный тайм-аут. Оставьте оба явными, поскольку запрос может повторно использовать готовое соединение. Исключение сети, аутентификации или туннеля может возникнуть до любого ответа назначения, тогда как возвращённый статус ошибки не обязательно вызывает исключение.
Повторно используйте клиент для запросов с одной политикой маршрутизации, чтобы приложение получало пользу от его управления соединениями.