Een HTTP-proxy gebruiken met Java HttpClient
Geef een ProxySelector door aan de HTTP-clientbuilder van Java en houd de verbindings- en verzoektimeout apart.
Stel vanaf Java 11 een ProxySelector in op de clientbuilder. De proxy-eigenschappen voor de hele JVM blijven zo ongemoeid:
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());
}
}Vervang het documentatie-endpoint door je HTTP-proxy; de HTTP-proxylijst biedt kandidaten om te testen. ProxySelector.of neemt een socketadres: gebruik de host zonder http://-voorvoegsel en geef de poort apart door. Het kiest een HTTP-proxy, niet SOCKS op basis van het poortnummer. De verzoek-URI blijft de echte bestemming.
HTTPS kan via deze HTTP-proxy door een tunnel. Je hoeft de bestemming niet te downgraden, en de instelling betekent niet dat de proxylistener zelf TLS ondersteunt.
De verbindingstimeout van de clientbuilder geldt bij het opzetten van een verbinding; het verzoek heeft een eigen timeout. Houd beide expliciet, want een verzoek kan een bestaande verbinding hergebruiken. Een netwerk-, authenticatie- of tunnelexceptie kan vóór enig antwoord van de bestemming optreden, terwijl een ontvangen foutstatus niet per se een exceptie oplevert.
Hergebruik de client voor verzoeken met hetzelfde routeringsbeleid, zodat de toepassing profijt heeft van het verbindingsbeheer.