1. Знайомство з HttpClient
Починаючи з JDK 11, розробники платформи Java додали до JDK новий потужний інструмент для виконання http-запитів – пакет java.net.http
. Він містить чотири ключові класи:
- HttpClient
- HttpRequest
- HttpResponse
- WebSocket
Це дуже потужні класи, які дозволяють виконувати всі можливі види запитів за протоколами HTTP
і HTTP/2
та WebSocket
До того ж, за допомогою цих класів можна виконувати як синхронні, так і асинхронні http-запити.
Виконання http-запиту складається з таких частин:
- Створення об'єкту
HttpClient
- Створення об'єкту
HttpRequеst
- Надсилання запиту за допомогою методу
send()
абоsendAsync()
- Обробка відповіді
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
повертають свій об'єкт, що дозволяє організувати код у вигляді ланцюжків.
Класичний код: |
---|
|
У вигляді ланцюжка: |
|
Переносимо кожен метод на окремий рядок (це один довгий стан) |
|
По-друге, у методів прибирають префікс set
, що дозволяє писати код ще компактніше:
Було |
---|
|
Стало |
|
Такий код простіше читати, хоч складніше писати.
І ще один важливий момент. У цьому прикладі використовувався шаблон Builder. Бувають сценарії, коли створення об'єкта – це складний процес. Тому його вважають за краще формалізувати: він починається з виклику умовного методу begin()
і закінчується викликом умовного методу end()
.
У прикладі, який ми розбирали, метод HttpClient.newBuilder()
повертає об'єкт HttpClient.Builder
(це внутрішній службовий клас класу HttpClient
). Усі методи типу version()
викликаються саме в цього службового об'єкта. Ну а виклик методу build()
означає закінчення побудови об'єкта і повертає об'єкт HttpClient
.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ