1.1 Wprowadzenie do HttpClient
Począwszy od JDK 11, twórcy platformy Java dodali do JDK nowe, potężne narzędzie do wysyłania żądań HTTP, plik java.net.http
. Zawiera cztery kluczowe klasy:
- HttpClient
- HttpRequest
- HttpOdpowiedź
- gniazdo internetowe
Są to bardzo potężne klasy, które pozwalają na wykonywanie wszystkich możliwych typów żądań przy użyciu protokołów HTTP
, HTTP/2
i WebSocket
.
Ponadto można używać tych klas do wykonywania zarówno synchronicznych, jak i asynchronicznych żądań HTTP.
Wykonanie żądania http składa się z następujących części:
- Utwórz obiekt
HttpClient
- Utwórz obiekt
HttpRequest
- Wysyłanie żądania przy użyciu metody
send()
lubsendAsync()
- Przetwarzanie odpowiedzi
HttpResponse
Przykład takiego żądania:
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 Podejście deklaratywne
W powyższym przykładzie widać przykład tzw. deklaratywnego podejścia do pisania kodu. Przyjrzyjmy się pierwszej części przykładu:
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();
Jak wyglądałby ten kod napisany w stylu klasycznym:
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());
Podczas korzystania z podejścia deklaratywnego w kodzie zmieniają się dwie rzeczy. Po pierwsze , wszystkie metody klasowe HttpClient
zwracają własny obiekt , co pozwala uporządkować kod w postaci łańcuchów.
Klasyczny kod: |
---|
|
Jako łańcuch: |
|
Każdą metodę przenosimy do osobnej linii (jest to jedna długa instrukcja) |
|
Po drugie , z metod usunięto przedrostek set
, co pozwala na pisanie kodu jeszcze bardziej zwięźle:
Był |
---|
|
Stało się |
|
Taki kod jest łatwiejszy do odczytania, choć trudniejszy do napisania.
I jeszcze jeden ważny punkt. W tym przykładzie użyto wzorca Builder. Istnieją scenariusze, w których tworzenie obiektu jest złożonym procesem. Dlatego wolą to sformalizować: zaczyna się warunkowym wywołaniem metody, begin()
a kończy warunkowym wywołaniem metody end()
.
W analizowanym przez nas przykładzie metoda HttpClient.newBuilder()
zwraca obiekt HttpClient.Builder
(jest to wewnętrzna klasa użyteczności klasy HttpClient
). Wszystkie metody typu version()
są wywoływane tylko w tym obiekcie usługi. Cóż, wywołanie metody build()
oznacza koniec konstrukcji obiektu i zwraca obiekt HttpClient
.
GO TO FULL VERSION