Ny HttpClient

All lectures for SV purposes
Nivå , Lektion
Tillgängliga

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.

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