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

HTTPHierbei handelt es sich um sehr leistungsstarke Klassen, mit denen Sie alle möglichen Arten von Anforderungen mithilfe der Protokolle , HTTP/2und 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:

  1. Erstellen Sie ein ObjektHttpClient
  2. Erstellen Sie ein ObjektHttpRequest
  3. Senden einer Anfrage mit der Methode send()odersendAsync()
  4. AntwortverarbeitungHttpResponse

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:

HttpClient client = HttpClient.new();
client.setVersion(Version.HTTP_1_1);
client.setFollowRedirects(Redirect.NORMAL);
client.setConnectTimeout(Duration.ofSeconds(20));
client.setAuthenticator(Authenticator.getDefault());
Als Kette:

HttpClient client = HttpClient.new() .setVersion(Version.HTTP_1_1) .setFollowRedirects(Redirect.NORMAL). setConnectTimeout(Duration.ofSeconds(20)) .setAuthenticator(Authenticator.getDefault());
Wir übertragen jede Methode in eine separate Zeile (dies ist eine lange Anweisung)

HttpClient client = HttpClient.new()
.setVersion(Version.HTTP_1_1)
.setFollowRedirects(Redirect.NORMAL)
.setConnectTimeout(Duration.ofSeconds(20))
.setAuthenticator(Authenticator.getDefault());

Zweitens wird das Präfix aus den Methoden entfernt set, wodurch Sie Code noch kompakter schreiben können:

War

HttpClient client = HttpClient.new()
.setVersion(Version.HTTP_1_1)
.setFollowRedirects(Redirect.NORMAL)
.setConnectTimeout(Duration.ofSeconds(20))
.setAuthenticator(Authenticator.getDefault());

Es wurde

HttpClient client = HttpClient.new()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.authenticator(Authenticator.getDefault());
    

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.