CodeGym /Java Course /Modulo 3 /Nuovo HttpClient

Nuovo HttpClient

Modulo 3
Livello 10 , Lezione 0
Disponibile

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/2e WebSocket.

Inoltre, puoi utilizzare queste classi per effettuare richieste http sincrone e asincrone.

La creazione di una richiesta http è composta dalle seguenti parti:

  1. Crea un oggettoHttpClient
  2. Crea un oggettoHttpRequest
  3. Invio di una richiesta utilizzando il metodo send()osendAsync()
  4. Elaborazione della rispostaHttpResponse

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:

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

HttpClient client = HttpClient.new() .setVersion(Version.HTTP_1_1) .setFollowRedirects(Redirect.NORMAL). setConnectTimeout(Duration.ofSeconds(20)) .setAuthenticator(Authenticator.getDefault());
Trasferiamo ogni metodo su una riga separata (questa è una lunga istruzione)

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

In secondo luogo , il prefisso viene rimosso dai metodi set, il che consente di scrivere codice in modo ancora più compatto:

Era

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

Diventò

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

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.

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