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:
- Creați un obiect
HttpClient
- Creați un obiect
HttpRequest
- Trimiterea unei cereri folosind metoda
send()
sausendAsync()
- Procesarea răspunsului
HttpResponse
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: |
---|
|
Ca lant: |
|
Transferăm fiecare metodă pe o linie separată (aceasta este o declarație lungă) |
|
În al doilea rând , prefixul este eliminat din metode set
, ceea ce vă permite să scrieți cod și mai compact:
A fost |
---|
|
A devenit |
|
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
.