1.1 Inleiding tot HttpClient
Vanaf JDK 11 hebben de ontwikkelaars van het Java-platform een krachtige nieuwe tool aan de JDK toegevoegd voor het maken van http-verzoeken, de java.net.http
. Het bevat vier hoofdklassen:
- HttpClient
- HttpRequest
- Http-antwoord
- web-socket
Dit zijn zeer krachtige klassen waarmee u alle mogelijke soorten verzoeken kunt uitvoeren met behulp van de HTTP
, HTTP/2
en WebSocket
.
Bovendien kunt u deze klassen gebruiken om zowel synchrone als asynchrone http-verzoeken te doen.
Het maken van een http-request bestaat uit de volgende onderdelen:
- Maak een voorwerp
HttpClient
- Maak een voorwerp
HttpRequest
- Een verzoek verzenden met behulp van de
send()
of methodesendAsync()
- Reactie verwerking
HttpResponse
Een voorbeeld van zo'n verzoek:
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 Declaratieve benadering
In het bovenstaande voorbeeld zie je een voorbeeld van de zogenaamde declaratieve benadering van het schrijven van code. Laten we eens kijken naar het eerste deel van het voorbeeld:
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();
Hoe deze code eruit zou zien, geschreven in klassieke stijl:
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());
Bij gebruik van de declaratieve benadering in de code veranderen er twee dingen. Ten eerste retourneren alle klassenmethoden HttpClient
hun eigen object , waarmee u code in de vorm van kettingen kunt organiseren.
Klassieke code: |
---|
|
Als ketting: |
|
We verplaatsen elke methode naar een aparte regel (dit is een lange instructie) |
|
Ten tweede wordt het voorvoegsel uit de methodes verwijderd set
, waardoor je nog compacter code kunt schrijven:
Was |
---|
|
Het werd |
|
Dergelijke code is gemakkelijker te lezen, hoewel moeilijker te schrijven.
En nog een belangrijk punt. In dit voorbeeld is het Builder-patroon gebruikt. Er zijn scenario's waarbij het maken van een object een complex proces is. Daarom geven ze er de voorkeur aan het te formaliseren: het begint met een voorwaardelijke methodeaanroep begin()
en eindigt met een voorwaardelijke methodeaanroep end()
.
HttpClient.newBuilder()
In het voorbeeld dat we hebben geanalyseerd, retourneert de methode een object HttpClient.Builder
(dit is een interne hulpprogrammaklasse van de klasse HttpClient
). Alle methoden van het type version()
worden alleen op dit serviceobject aangeroepen. Welnu, de aanroep van de methode build()
markeert het einde van de constructie van het object en retourneert het object HttpClient
.
GO TO FULL VERSION