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:
- Hozzon létre egy objektumot
HttpClient
- Hozzon létre egy objektumot
HttpRequest
- Kérelem elküldése a
send()
vagy módszerrelsendAsync()
- Válasz feldolgozása
HttpResponse
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: |
---|
|
Láncként: |
|
Minden metódust külön sorba helyezünk (ez egy hosszú utasítás) |
|
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 |
---|
|
Lett belőle |
|
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
.