Usare un proxy HTTP con Java HttpClient
Passa un ProxySelector al builder del client HTTP di Java e mantieni separati i timeout di connessione e richiesta.
Da Java 11 in poi, imposta un ProxySelector sul builder del client. Le proprietà proxy dell’intera JVM restano così invariate:
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());
}
}Sostituisci l’endpoint di documentazione con il tuo proxy HTTP; la lista di proxy HTTP offre candidati da provare. ProxySelector.of accetta un indirizzo socket: usa l’host senza prefisso http:// e fornisci la porta separatamente. Seleziona un proxy HTTP, non SOCKS in base al numero di porta. L’URI della richiesta rimane la destinazione reale.
HTTPS può attraversare questo proxy HTTP tramite un tunnel. Non occorre declassare la destinazione e la configurazione non implica che il listener del proxy supporti TLS.
Il timeout di connessione del builder si applica durante l’apertura di una connessione; la richiesta ha un timeout proprio. Tieni entrambi espliciti perché una richiesta può riutilizzare una connessione esistente. Un’eccezione di rete, autenticazione o tunnel può arrivare prima di qualsiasi risposta della destinazione, mentre uno stato di errore ricevuto non deve necessariamente generare un’eccezione.
Riutilizza il client per le richieste con la stessa politica di instradamento, così l’applicazione può sfruttarne la gestione delle connessioni.