Новий HttpClient

Модуль 3. Java Professional
Рівень 10 , Лекція 0
Відкрита

1. Знайомство з HttpClient

Починаючи з JDK 11, розробники платформи Java додали до JDK новий потужний інструмент для виконання http-запитів – пакет java.net.http. Він містить чотири ключові класи:

  • HttpClient
  • HttpRequest
  • HttpResponse
  • WebSocket

Це дуже потужні класи, які дозволяють виконувати всі можливі види запитів за протоколами HTTP і HTTP/2 та WebSocket

До того ж, за допомогою цих класів можна виконувати як синхронні, так і асинхронні http-запити.

Виконання http-запиту складається з таких частин:

  1. Створення об'єкту HttpClient
  2. Створення об'єкту HttpRequеst
  3. Надсилання запиту за допомогою методу send() або sendAsync()
  4. Обробка відповіді HttpResponse

Приклад такого запиту:


 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()); 

2. Декларативний підхід

На прикладі вище ти можеш бачити так званий декларативний підхід до написання коду. Давай розберемо першу частину прикладу:


 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();

Як би виглядав цей код, написаний у класичному стилі:


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());

При використанні декларативного підходу у коді змінюються дві речі. По-перше, всі методи класу HttpClient повертають свій об'єкт, що дозволяє організувати код у вигляді ланцюжків.

Класичний код:

HttpClient client = HttpClient.new();
client.setVersion(Version.HTTP_1_1);
client.setFollowRedirects(Redirect.NORMAL);
client.setConnectTimeout(Duration.ofSeconds(20));
client.setAuthenticator(Authenticator.getDefault());
У вигляді ланцюжка:

HttpClient client = HttpClient.new() .setVersion(Version.HTTP_1_1) .setFollowRedirects(Redirect.NORMAL). setConnectTimeout(Duration.ofSeconds(20)) .setAuthenticator(Authenticator.getDefault());
Переносимо кожен метод на окремий рядок (це один довгий стан)

HttpClient client = HttpClient.new()
.setVersion(Version.HTTP_1_1)
.setFollowRedirects(Redirect.NORMAL)
.setConnectTimeout(Duration.ofSeconds(20))
.setAuthenticator(Authenticator.getDefault());

По-друге, у методів прибирають префікс set, що дозволяє писати код ще компактніше:

Було

HttpClient client = HttpClient.new()
.setVersion(Version.HTTP_1_1)
.setFollowRedirects(Redirect.NORMAL)
.setConnectTimeout(Duration.ofSeconds(20))
.setAuthenticator(Authenticator.getDefault());

Стало

HttpClient client = HttpClient.new()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.authenticator(Authenticator.getDefault());
    

Такий код простіше читати, хоч складніше писати.

І ще один важливий момент. У цьому прикладі використовувався шаблон Builder. Бувають сценарії, коли створення об'єкта – це складний процес. Тому його вважають за краще формалізувати: він починається з виклику умовного методу begin() і закінчується викликом умовного методу end().

У прикладі, який ми розбирали, метод HttpClient.newBuilder() повертає об'єкт HttpClient.Builder (це внутрішній службовий клас класу HttpClient). Усі методи типу version() викликаються саме в цього службового об'єкта. Ну а виклик методу build() означає закінчення побудови об'єкта і повертає об'єкт HttpClient.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ