1.1 Introduktion till HttpClient

Från och med JDK 11 lade utvecklarna av Java-plattformen till ett kraftfullt nytt verktyg till JDK för att göra http-förfrågningar, java.net.http. Den innehåller fyra nyckelklasser:

  • HttpClient
  • HttpRequest
  • HttpResponse
  • webbuttag

Dessa är mycket kraftfulla klasser som låter dig utföra alla möjliga typer av förfrågningar med hjälp av HTTP, HTTP/2och WebSocket.

Dessutom kan du använda dessa klasser för att göra både synkrona och asynkrona http-förfrågningar.

Att göra en http-förfrågan består av följande delar:

  1. Skapa ett objektHttpClient
  2. Skapa ett objektHttpRequest
  3. Skicka en förfrågan med metoden send()ellersendAsync()
  4. SvarsbearbetningHttpResponse

Ett exempel på en sådan begäran:


 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 Deklarativt förhållningssätt

I exemplet ovan ser du ett exempel på det så kallade deklarativa förhållningssättet till att skriva kod. Låt oss ta en titt på den första delen av exemplet:


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

Hur den här koden skulle se ut skriven i klassisk stil:


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

När man använder den deklarativa metoden i koden förändras två saker. För det första returnerar alla klassmetoder HttpClient sitt eget objekt , vilket låter dig organisera kod i form av kedjor.

Klassisk kod:

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

HttpClient client = HttpClient.new() .setVersion(Version.HTTP_1_1) .setFollowRedirects(Redirect.NORMAL). setConnectTimeout(Duration.ofSeconds(20)) .setAuthenticator(Authenticator.getDefault());
Vi överför varje metod till en separat rad (detta är ett långt uttalande)

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

För det andra tas prefixet bort från metoderna, setvilket gör att du kan skriva kod ännu mer kompakt:

Var

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

Det blev

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

Sådan kod är lättare att läsa, men svårare att skriva.

Och ytterligare en viktig punkt. I det här exemplet användes Builder-mönstret. Det finns scenarier där att skapa ett objekt är en komplex process. Därför föredrar de att formalisera det: det börjar med ett villkorligt metodanrop begin()och slutar med ett villkorligt metodanrop end().

I exemplet som vi analyserade HttpClient.newBuilder()returnerar metoden ett objekt HttpClient.Builder(detta är en intern nyttoklass av klassen ) HttpClient. Alla metoder av typen version()anropas bara på detta serviceobjekt. Tja, anropet av metoden build()markerar slutet på konstruktionen av objektet och returnerar objektet HttpClient.