1.1 Introducere în HttpClient

Începând cu JDK 11, dezvoltatorii platformei Java au adăugat un nou instrument puternic la JDK pentru a face cereri http, java.net.http. Conține patru clase cheie:

  • HttpClient
  • HttpRequest
  • HttpResponse
  • priza web

Acestea sunt clase foarte puternice care vă permit să efectuați toate tipurile posibile de solicitări folosind HTTP, HTTP/2și WebSocket.

În plus, puteți utiliza aceste clase pentru a face atât solicitări http sincrone, cât și asincrone.

Efectuarea unei solicitări http constă din următoarele părți:

  1. Creați un obiectHttpClient
  2. Creați un obiectHttpRequest
  3. Trimiterea unei cereri folosind metoda send()sausendAsync()
  4. Procesarea răspunsuluiHttpResponse

Un exemplu de astfel de solicitare:


 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 Abordare declarativă

În exemplul de mai sus, vedeți un exemplu de așa-numită abordare declarativă a scrierii codului. Să aruncăm o privire la prima parte a exemplului:


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

Cum ar arăta acest cod scris în stil clasic:


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

Când utilizați abordarea declarativă în cod, două lucruri se schimbă. În primul rând , toate metodele de clasă HttpClient returnează propriul obiect , ceea ce vă permite să organizați codul sub formă de lanțuri.

Cod clasic:

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

HttpClient client = HttpClient.new() .setVersion(Version.HTTP_1_1) .setFollowRedirects(Redirect.NORMAL). setConnectTimeout(Duration.ofSeconds(20)) .setAuthenticator(Authenticator.getDefault());
Transferăm fiecare metodă pe o linie separată (aceasta este o declarație lungă)

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

În al doilea rând , prefixul este eliminat din metode set, ceea ce vă permite să scrieți cod și mai compact:

A fost

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

A devenit

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

Un astfel de cod este mai ușor de citit, deși mai greu de scris.

Și încă un punct important. În acest exemplu, a fost folosit modelul Builder. Există scenarii în care crearea unui obiect este un proces complex. Prin urmare, preferă să-l oficializeze: începe cu un apel de metodă condiționat begin()și se termină cu un apel de metodă condiționat end().

În exemplul pe care l-am analizat, metoda HttpClient.newBuilder()returnează un obiect HttpClient.Builder(aceasta este o clasă de utilitate internă a clasei HttpClient). Toate metodele de acest tip version()sunt apelate doar pe acest obiect de serviciu. Ei bine, apelul metodei build()marchează sfârșitul construcției obiectului și returnează obiectul HttpClient.