Nowy HttpClient

All lectures for PL purposes
Poziom 1 , Lekcja 446
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
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION