1.1 A HttpClient bemutatása

A JDK 11-től kezdődően a Java platform fejlesztői egy új, hatékony eszközt adtak a JDK-hoz a http kérések elkészítéséhez, a java.net.http. Négy kulcsosztályt tartalmaz:

  • HttpClient
  • HttpRequest
  • HttpResponse
  • webes aljzat

Ezek nagyon hatékony osztályok, amelyek lehetővé teszik az összes lehetséges kérés végrehajtását a HTTP, HTTP/2és a WebSocket.

Ezenkívül ezekkel az osztályokkal szinkron és aszinkron http kéréseket is készíthet.

A http kérés a következő részekből áll:

  1. Hozzon létre egy objektumotHttpClient
  2. Hozzon létre egy objektumotHttpRequest
  3. Kérelem elküldése a send()vagy módszerrelsendAsync()
  4. Válasz feldolgozásaHttpResponse

Példa egy ilyen kérésre:


 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 Deklaratív megközelítés

A fenti példában láthat egy példát a kódírás úgynevezett deklaratív megközelítésére. Nézzük a példa első részét:


 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();

Hogyan nézne ki ez a kód klasszikus stílusban írva:


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());

A deklaratív megközelítés használatakor a kódban két dolog változik. Először is , minden osztálymetódus HttpClient saját objektumot ad vissza , amely lehetővé teszi a kód láncok formájában történő szervezését.

Klasszikus kód:

HttpClient client = HttpClient.new();
client.setVersion(Version.HTTP_1_1);
client.setFollowRedirects(Redirect.NORMAL);
client.setConnectTimeout(Duration.ofSeconds(20));
client.setAuthenticator(Authenticator.getDefault());
Láncként:

HttpClient client = HttpClient.new() .setVersion(Version.HTTP_1_1) .setFollowRedirects(Redirect.NORMAL). setConnectTimeout(Duration.ofSeconds(20)) .setAuthenticator(Authenticator.getDefault());
Minden metódust külön sorba helyezünk (ez egy hosszú utasítás)

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

Másodszor , az előtagot eltávolítják a metódusokból set, ami lehetővé teszi a kód még tömörebb írását:

Volt

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

Lett belőle

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

Az ilyen kódokat könnyebb olvasni, bár nehezebb írni.

És még egy fontos szempont. Ebben a példában a Builder mintát használtuk. Vannak olyan helyzetek, amikor egy objektum létrehozása összetett folyamat. Ezért inkább formalizálják: feltételes metódushívással kezdődik begin()és feltételes metódushívással végződik end().

Az általunk elemzett példában a metódus HttpClient.newBuilder()egy objektumot ad vissza HttpClient.Builder(ez az osztály belső segédosztálya HttpClient). A típus összes metódusa version()csak ezen a szolgáltatásobjektumon kerül meghívásra. Nos, a metódus hívása build()jelzi az objektum felépítésének végét, és visszaadja az objektumot HttpClient.