1.1 Introduzione a HttpClient
A partire da JDK 11, gli sviluppatori della piattaforma Java hanno aggiunto un nuovo potente strumento al JDK per effettuare richieste http, il java.net.http
. Contiene quattro classi chiave:
- HttpClient
- HttpRequest
- HttpResponse
- presa web
Si tratta di classi molto potenti che ti consentono di eseguire tutti i possibili tipi di richieste utilizzando HTTP
, HTTP/2
e WebSocket
.
Inoltre, puoi utilizzare queste classi per effettuare richieste http sincrone e asincrone.
La creazione di una richiesta http è composta dalle seguenti parti:
- Crea un oggetto
HttpClient
- Crea un oggetto
HttpRequest
- Invio di una richiesta utilizzando il metodo
send()
osendAsync()
- Elaborazione della risposta
HttpResponse
Un esempio di tale richiesta:
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 Approccio dichiarativo
Nell'esempio sopra, vedi un esempio del cosiddetto approccio dichiarativo alla scrittura del codice. Diamo un'occhiata alla prima parte dell'esempio:
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();
Come sarebbe questo codice scritto in stile classico:
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());
Quando si utilizza l'approccio dichiarativo nel codice, due cose cambiano. In primo luogo , tutti i metodi di classe HttpClient
restituiscono il proprio oggetto , che consente di organizzare il codice sotto forma di catene.
Codice classico: |
---|
|
Come una catena: |
|
Trasferiamo ogni metodo su una riga separata (questa è una lunga istruzione) |
|
In secondo luogo , il prefisso viene rimosso dai metodi set
, il che consente di scrivere codice in modo ancora più compatto:
Era |
---|
|
Diventò |
|
Tale codice è più facile da leggere, sebbene più difficile da scrivere.
E un altro punto importante. In questo esempio è stato utilizzato il modello Builder. Esistono scenari in cui la creazione di un oggetto è un processo complesso. Pertanto, preferiscono formalizzarlo: inizia con una chiamata al metodo condizionale begin()
e termina con una chiamata al metodo condizionale end()
.
Nell'esempio che abbiamo analizzato, il metodo HttpClient.newBuilder()
restituisce un oggetto HttpClient.Builder
(questa è una classe di utilità interna della classe HttpClient
). Tutti i metodi del tipo version()
vengono chiamati solo su questo oggetto servizio. Ebbene, la chiamata del metodo build()
segna la fine della costruzione dell'oggetto e restituisce l'oggetto HttpClient
.
GO TO FULL VERSION