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/2i 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