No Java 11 ou posterior, configure um ProxySelector no builder do cliente. Isso deixa intactas as propriedades de proxy de toda a 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());
    }
}

Substitua o endpoint de documentação pelo seu proxy HTTP; a lista de proxies HTTP fornece candidatos para teste. ProxySelector.of recebe um endereço de socket: use o host sem o prefixo http:// e informe a porta separadamente. Ele seleciona um proxy HTTP, não SOCKS com base no número da porta. A URI da requisição continua sendo o destino real.

HTTPS pode passar por esse proxy HTTP usando um túnel. Não é necessário rebaixar o destino, e a configuração não implica suporte a TLS no próprio listener do proxy.

O timeout de conexão do builder se aplica ao estabelecer uma conexão; a requisição tem seu próprio timeout. Mantenha ambos visíveis, pois uma requisição pode reutilizar uma conexão existente. Uma exceção de rede, autenticação ou túnel pode ocorrer antes de qualquer resposta do destino, enquanto um status de erro recebido não precisa gerar uma exceção.

Reutilize o cliente para requisições com a mesma política de roteamento, para que a aplicação aproveite seu gerenciamento de conexões.

Artigos relacionados