CodeGym/Kursy Java/Moduł 3/Nowy HttpClient

Nowy HttpClient

Dostępny

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:

  1. Utwórz obiektHttpClient
  2. Utwórz obiektHttpRequest
  3. Wysyłanie żądania przy użyciu metody send()lubsendAsync()
  4. Przetwarzanie odpowiedziHttpResponse

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:
HttpClient client = HttpClient.new();
client.setVersion(Version.HTTP_1_1);
client.setFollowRedirects(Redirect.NORMAL);
client.setConnectTimeout(Duration.ofSeconds(20));
client.setAuthenticator(Authenticator.getDefault());
Jako łańcuch:
HttpClient client = HttpClient.new() .setVersion(Version.HTTP_1_1) .setFollowRedirects(Redirect.NORMAL). setConnectTimeout(Duration.ofSeconds(20)) .setAuthenticator(Authenticator.getDefault());
Każdą metodę przenosimy do osobnej linii (jest to jedna długa instrukcja)
HttpClient client = HttpClient.new()
.setVersion(Version.HTTP_1_1)
.setFollowRedirects(Redirect.NORMAL)
.setConnectTimeout(Duration.ofSeconds(20))
.setAuthenticator(Authenticator.getDefault());

Po drugie , z metod usunięto przedrostek set, co pozwala na pisanie kodu jeszcze bardziej zwięźle:

Był
HttpClient client = HttpClient.new()
.setVersion(Version.HTTP_1_1)
.setFollowRedirects(Redirect.NORMAL)
.setConnectTimeout(Duration.ofSeconds(20))
.setAuthenticator(Authenticator.getDefault());
Stało się
HttpClient client = HttpClient.new()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.authenticator(Authenticator.getDefault());

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.

Komentarze
  • Popularne
  • Najnowsze
  • Najstarsze
Musisz się zalogować, aby dodać komentarz
Ta strona nie ma jeszcze żadnych komentarzy