У 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 самим слухачем проксі.

Тайм-аут з’єднання в будівнику діє під час установлення з’єднання; запит має власний тайм-аут. Тримайте обидва явними, бо запит може повторно використати готове з’єднання. Виняток мережі, автентифікації або тунелю може виникнути до будь-якої відповіді призначення, тоді як повернутий статус помилки не обов’язково спричиняє виняток.

Повторно використовуйте клієнт для запитів з однаковою політикою маршрутизації, щоб застосунок отримував користь від його керування з’єднаннями.

Схожі статті