1.1 Einführung in HttpClient
Beginnend mit JDK 11 fügten die Entwickler der Java-Plattform dem JDK ein leistungsstarkes neues Tool zum Erstellen von HTTP-Anfragen hinzu: die java.net.http
. Es enthält vier Schlüsselklassen:
- HttpClient
- HttpRequest
- HttpResponse
- Web-Socket
HTTP
Hierbei handelt es sich um sehr leistungsstarke Klassen, mit denen Sie alle möglichen Arten von Anforderungen mithilfe der Protokolle , HTTP/2
und ausführen können WebSocket
.
Darüber hinaus können Sie diese Klassen verwenden, um sowohl synchrone als auch asynchrone http-Anfragen zu stellen.
Das Erstellen einer HTTP-Anfrage besteht aus den folgenden Teilen:
- Erstellen Sie ein Objekt
HttpClient
- Erstellen Sie ein Objekt
HttpRequest
- Senden einer Anfrage mit der Methode
send()
odersendAsync()
- Antwortverarbeitung
HttpResponse
Ein Beispiel für eine solche Anfrage:
HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
.authenticator(Authenticator.getDefault())
.build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
1.2 Deklarativer Ansatz
Im obigen Beispiel sehen Sie ein Beispiel für den sogenannten deklarativen Ansatz beim Schreiben von Code. Schauen wir uns den ersten Teil des Beispiels an:
HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
.authenticator(Authenticator.getDefault())
.build();
So würde dieser im klassischen Stil geschriebene Code aussehen:
HttpClient client = HttpClient.new();
client.setVersion(Version.HTTP_1_1);
client.setFollowRedirects(Redirect.NORMAL);
client.setConnectTimeout(Duration.ofSeconds(20));
client.setProxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)));
client.setAuthenticator(Authenticator.getDefault());
Bei Verwendung des deklarativen Ansatzes im Code ändern sich zwei Dinge. Erstens geben alle Klassenmethoden HttpClient
ihr eigenes Objekt zurück , wodurch Sie Code in Form von Ketten organisieren können.
Klassischer Code: |
---|
|
Als Kette: |
|
Wir übertragen jede Methode in eine separate Zeile (dies ist eine lange Anweisung) |
|
Zweitens wird das Präfix aus den Methoden entfernt set
, wodurch Sie Code noch kompakter schreiben können:
War |
---|
|
Es wurde |
|
Ein solcher Code ist leichter zu lesen, aber schwieriger zu schreiben.
Und noch ein wichtiger Punkt. In diesem Beispiel wurde das Builder-Muster verwendet. Es gibt Szenarien, in denen das Erstellen eines Objekts ein komplexer Prozess ist. Daher bevorzugen sie eine Formalisierung: Es beginnt mit einem bedingten Methodenaufruf begin()
und endet mit einem bedingten Methodenaufruf end()
.
In dem von uns analysierten Beispiel gibt die Methode HttpClient.newBuilder()
ein Objekt zurück HttpClient.Builder
(dies ist eine interne Dienstprogrammklasse der Klasse HttpClient
). Alle Methoden dieses Typs version()
werden nur für dieses Serviceobjekt aufgerufen. Nun, der Aufruf der Methode build()
markiert das Ende der Konstruktion des Objekts und gibt das Objekt zurück HttpClient
.
GO TO FULL VERSION