Einen HTTP-Proxy mit Java HttpClient verwenden
Übergeben Sie dem HTTP-Client-Builder von Java einen ProxySelector und halten Sie Verbindungs- und Anfrage-Timeout getrennt.
Ab Java 11 setzen Sie einen ProxySelector am Client-Builder. Die Proxy-Eigenschaften für die gesamte JVM bleiben dabei unangetastet:
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());
}
}Ersetzen Sie den Dokumentationsendpunkt durch Ihren HTTP-Proxy; die HTTP-Proxy-Liste liefert Testkandidaten. ProxySelector.of erwartet eine Socket-Adresse: verwenden Sie den Host ohne http://-Präfix und geben Sie den Port separat an. Es wird ein HTTP-Proxy ausgewählt, nicht anhand der Portnummer SOCKS. Die Anfrage-URI bleibt das tatsächliche Ziel.
HTTPS kann diesen HTTP-Proxy über einen Tunnel passieren. Das Ziel muss nicht herabgestuft werden, und die Einrichtung bedeutet nicht, dass der Proxy-Listener selbst TLS unterstützt.
Der Verbindungs-Timeout des Client-Builders gilt beim Verbindungsaufbau; die Anfrage hat ihren eigenen Timeout. Halten Sie beide sichtbar, da eine Anfrage eine bestehende Verbindung wiederverwenden kann. Eine Netzwerk-, Authentifizierungs- oder Tunnel-Ausnahme kann vor jeder Zielantwort auftreten, während ein zurückgegebener Fehlerstatus nicht zwingend eine Ausnahme auslöst.
Verwenden Sie den Client für Anfragen mit derselben Routing-Richtlinie wieder, damit die Anwendung von seiner Verbindungsverwaltung profitiert.