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.
GO TO FULL VERSION