HTTP-välityspalvelimen käyttö Java HttpClientissä
Anna Javan HTTP-asiakasrakentajalle ProxySelector ja pidä yhteyden ja pyynnön aikakatkaisut erillään.
Java 11:ssä ja uudemmissa määritä ProxySelector asiakasrakentajaan. Koko JVM:n välityspalvelinominaisuudet pysyvät näin ennallaan:
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());
}
}Korvaa dokumentaation päätepiste omalla HTTP-välityspalvelimellasi; HTTP-välityspalvelinluettelo tarjoaa testattavia ehdokkaita. ProxySelector.of ottaa sokettiosoitteen: käytä isäntää ilman http://-etuliitettä ja anna portti erikseen. Se valitsee HTTP-välityspalvelimen, ei SOCKSia porttinumeron perusteella. Pyynnön URI pysyy todellisena kohteena.
HTTPS voi kulkea tämän HTTP-välityspalvelimen kautta tunnelissa. Kohteen suojausta ei tarvitse heikentää, eikä määritys tarkoita, että välityspalvelimen kuuntelija itse tukisi TLS:ää.
Asiakasrakentajan yhteysaikakatkaisu koskee yhteyden muodostamista; pyynnöllä on oma aikakatkaisunsa. Pidä molemmat näkyvissä, sillä pyyntö voi käyttää olemassa olevaa yhteyttä uudelleen. Verkko-, tunnistautumis- tai tunnelipoikkeus voi tulla ennen kohteen vastausta, kun taas palautettu virhetila ei välttämättä aiheuta poikkeusta.
Käytä asiakasta uudelleen saman reitityskäytännön pyynnöille, jotta sovellus hyötyy sen yhteyksien hallinnasta.