Yeni HttpClient

All lectures for AZ purposes
Səviyyə , Dərs
Mövcuddur

1.1 HttpClient ilə Tanışlıq

JDK 11-dən başlayaraq Java platformasının tərtibatçıları JDK-ya çəkici bir alət əlavə ediblər — java.net.http paketi. O, dörd əsas sinifdən ibarətdir:

  • HttpClient
  • HttpRequest
  • HttpResponse
  • WebSocket

Bunlar, HTTP, HTTP/2WebSocket protokolları üzrə istənilən növ sorğuları həyata keçirməyə imkan verən çox güclü siniflərdir.

Bundan əlavə, bu siniflər vasitəsilə sinxron və asinxron http-sorğuları da həyata keçirilə bilər.

Http-sorğusunun icrası aşağıdakı hissələrdən ibarətdir:

  1. HttpClient obyektinin yaradılması
  2. HttpRequest obyektinin yaradılması
  3. send() və ya sendAsync() metodu ilə sorğunun göndərilməsi
  4. HttpResponse cavabının işlənməsi

Bu cür sorğuya bir nümunə:


 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 Yanaşma

Yuxarıdakı nümunədə sən deklarativ kod yazma yanaşmasının bir nümunəsini görürsən. Gəlin nümunənin ilk hissəsini təhlil edək:


 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 üslubda necə görünürdü:


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 yanaşma istifadə edərkən kodda iki şey dəyişir. Birincisi, HttpClient sinifinin metodları öz obyektlərini qaytarırlar, bu da kodu zəncir şəklində təşkil etməyə imkan verir.

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());
Zəncir şəklində:

HttpClient client = HttpClient.new() .setVersion(Version.HTTP_1_1) .setFollowRedirects(Redirect.NORMAL). setConnectTimeout(Duration.ofSeconds(20)) .setAuthenticator(Authenticator.getDefault());
Hər metodu ayrıca bir sətrə keçirdirik (bu bir uzun statementdir)

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

İkincisi, metodlardan set prefiksi qaldırılır, bu da kodu daha kompakt yazmağa imkan verir:

Əvvəl

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

Sonra

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

Bu kod oxumaq daha asandır, baxmayaraq ki, yazmaq bir az çətindir.

Və daha bir vacib məqam. Bu nümunədə Builder patternindən istifadə olunub. Obyektin yaradılması kompleks proses olarsa, bu skenarilərdə onu formallaşdırmağa üstünlük verirlər: o, şərti begin() metodunun çağırılması ilə başlayır və şərti end() metodu ilə bitir.

Təhlil etdiyimiz nümunədə metod HttpClient.newBuilder() HttpClient.Builder obyektini qaytarır (bu, HttpClient sinfinin daxili xidmət sinfidir). Belə xidmət obyektlərində hər cür version() tipli metodlar çağırılır. Bəs metod build() obyektin qurulmasının sonunu göstərir və HttpClient obyektini qaytarır.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION