Yangi HttpClient

All lectures for UZ purposes
Daraja, Dars
Mavjud

1.1 HttpClient bilan tanishish

JDK 11-dan boshlab Java platformasi ishlab chiquvchilari JDK-ga yangi kuchli vosita - HTTP so'rovlarini bajarish uchun java.net.http paketi qo'shishdi. U to'rtta asosiy klassni o'z ichiga oladi:

  • HttpClient
  • HttpRequest
  • HttpResponse
  • WebSocket

Bu juda kuchli klasslar bo'lib, HTTP, HTTP/2 va WebSocket protokollari yordamida barcha mumkin bo'lgan so'rovlarni bajarishga imkon beradi.

Bundan tashqari, bu klasslar yordamida sinxron va asinxron HTTP so'rovlarini bajarish mumkin.

HTTP so'rovi quyidagi qismlardan iborat:

  1. HttpClient obyektini yaratish
  2. HttpRequest obyektini yaratish
  3. send() yoki sendAsync() metodlari yordamida so'rovni yuborish
  4. HttpResponse javobini qayta ishlash

Mana bunday so'rovning misoli:


 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 Deklarativ yondashuv

Yuqoridagi misolda sen kod yozishda deklarativ yondashuv deb ataladigan yondashuvning misolini ko'rmoqdasiz. Keling, misolning birinchi qismini ko'rib chiqaylik:


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

Bu kod klassik uslubda qanday ko'rinishda bo'lardi:


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

Deklarativ yondashuv ishlatilganda kodda ikkita narsa o'zgaradi. Birinchidan, HttpClient klassining barcha metodlari o'z obyektini qaytaradi, bu esa kodni zanjirlar shaklida tashkil qilish imkonini beradi.

Klassik kod:

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

HttpClient client = HttpClient.new() .setVersion(Version.HTTP_1_1) .setFollowRedirects(Redirect.NORMAL). setConnectTimeout(Duration.ofSeconds(20)) .setAuthenticator(Authenticator.getDefault());
Har bir metodni alohida qatorda yozamiz (bu bitta uzun statement)

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

Ikkinchidan, metodlar prefiks set'ni olib tashlashadi, bu esa kodni yanada ixchamroq yozishni ta'minlaydi:

Oldin

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

Hozir

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

Bu kodni o'qish osonroq, garchi yozish qiyinroq bo'lsa.

Yana bir muhim nuqta. Bu misolda Builder deb nomlangan pattern (shablon) ishlatilgan. Obyekt yaratish - bu murakkab jarayon bo'lgan ssenariylar mavjud. Shuning uchun uni rasmiylashtirishni afzal ko'rishadi: u shartli begin() metodini chaqirish bilan boshlanadi va shartli end() metodini chaqirish bilan yakunlanadi.

Ko'rib turgan misolimizda HttpClient.newBuilder() metodi HttpClient.Builder obyektini qaytaradi (bu HttpClient klassining ichki xizmat ko'rsatuvchi klassi). version() turidagi barcha metodlar aynan shu xizmat ko'rsatuvchi obyektda chaqiriladi. Va build() metodini chaqirish ob'ekt qurilishini tugatishni belgilaydi va HttpClient ob'ektini qaytaradi.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION