En Java 11 o posterior, establece un ProxySelector en el constructor del cliente. Así no se modifican las propiedades de proxy de toda la 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());
    }
}

Sustituye el endpoint de documentación por tu proxy HTTP; la lista de proxies HTTP ofrece candidatos para probar. ProxySelector.of recibe una dirección de socket: usa el host sin el prefijo http:// y indica el puerto por separado. Selecciona un proxy HTTP, no SOCKS según el número de puerto. La URI de la petición sigue siendo el destino real.

HTTPS puede atravesar este proxy HTTP mediante un túnel. No hace falta degradar el destino y la configuración no implica que el propio punto de escucha del proxy admita TLS.

El tiempo de espera de conexión del constructor se aplica al establecer una conexión; la petición tiene su propio tiempo de espera. Mantén ambos explícitos porque una petición puede reutilizar una conexión existente. Una excepción de red, autenticación o túnel puede aparecer antes de cualquier respuesta del destino, mientras que un estado de error recibido no tiene por qué lanzar una excepción.

Reutiliza el cliente para peticiones con la misma política de enrutamiento, de modo que la aplicación aproveche su gestión de conexiones.

Artículos relacionados