4.1 De send() methode, BodyHandlers
U bent klaar met het leren hoe u een http-verzoek maakt , dus u kunt verder gaan met het belangrijkste: dit verzoek verzenden. In het eenvoudigste geval is dit gemakkelijk te doen:
HttpRequest request = HttpRequest.newBuilder(new URI("https://codegym.cc")).build();
HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode() );
System.out.println(response.body() );
En wat zijn BodyHandlers
dit? Wat denk je? U heeft een verzoek verzonden, wat betekent dat u een antwoord zou moeten ontvangen - http response
. En dit antwoord kan hebben response body
: een string, een bestand, een array van bytes, een InputStream.
Ja, ja, dat klopt. response body
Net als bij het vormen van een verzoek, moet u het type antwoord specificeren . Er kunnen in totaal 8 stuks zijn:
BodyHandlers.ofByteArray
BodyHandlers.ofString
BodyHandlers.ofFile
BodyHandlers.discarding
BodyHandlers.replacing
BodyHandlers.ofLines
BodyHandlers.fromLineSubscriber
Afhankelijk van welk type BodyHandlers
u aan de methode hebt doorgegeven send()
, zal het zo'n resultaattype retourneren. Voorbeeld:
// response body is ignored
HttpResponse<Void> response = client.send(request, BodyHandlers.discarding());
// response body is a string
HttpResponse<String>response = client.send(request, BodyHandlers.ofString());
// response body is a file
HttpResponse<Path> response = client.send(request, BodyHandlers.ofFile(Paths.get("readme.txt")));
// response body is an InputStream
HttpResponse<InputStream> response = client.send(request, BodyHandlers.ofInputStream());
Als een bestand als antwoord naar u moet worden verzonden, BodyHandlers.ofFile()
moet u de naam van het lokale bestand doorgeven aan de methode, waar het wordt opgeslagen door het HttpClient-object.
4.2 followRedirects() methode
301
Ook kunt u bij het verzenden van een verzoek specificeren wat HttpClient moet doen als de server een of 302
(tijdelijke of permanente omleiding) als reactie verzendt. Stel je voor dat de server een code heeft verzonden 302
en je moet: deze situatie volgen, een nieuwe URL uit het antwoord halen en het verzoek naar het nieuwe adres sturen.
Ik zou dit niet graag doen, vooral gezien het feit dat deze situatie veel voorkomt en al lang is geautomatiseerd in alle http-clients. Ook in deze HttpClient hoeft u alleen maar aan te geven welke omleidingsmodus u kiest bij het verzenden van het verzoek.
HttpResponse response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS )
.build()
.send(request, BodyHandlers.ofString());
Er zijn slechts 3 opties voor een omleiding:
- ALTIJD - altijd;
- NOOIT - nooit;
- NORMAAL - altijd, behalve HTTPS -> HTTP.
Zoals je kunt zien, zijn er hier niet veel opties, maar het is altijd beter om de mogelijkheid te hebben om aan te passen dan om het niet te hebben.
4.4 De proxy()-methode
Er zijn nog een paar handige, maar niet vaak gebruikte opties. Je hebt ze pas echt nodig als je ze nodig hebt :)
De eerste is proxy. In het gewone leven kom je ze niet vaak tegen, maar veel grote bedrijven hebben een complex beveiligingssysteem voor internetverkeer in zich, en dus verschillende proxy-instellingen.
Welnu, uw software, die ergens in de ingewanden van zo'n bedrijf zal werken, zal op een dag het feit tegenkomen dat het een proxy moet gebruiken. Daarom is het goed dat zo'n optie er ook is.
Het instellen van een proxy is heel eenvoudig - een voorbeeld:
HttpResponse<String> response = HttpClient.newBuilder()
.proxy( ProxySelector.getDefault())
.build()
.send(request, BodyHandlers.ofString());
De standaardproxy is hier gekozen, maar misschien wilt u uw eigen proxy instellen:
HttpResponse response = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
.build()
.send(request, BodyHandlers.ofString());
Hoe we precies met een proxy moeten werken, zullen we niet bespreken, aangezien dit niet in de reikwijdte van deze cursus is opgenomen.
4.5 authenticator()
En nog een belangrijk punt. Het HTTP-protocol ondersteunt authenticatie. Precies op protocolniveau.
Nu wordt deze aanpak bijna niet gebruikt, maar ongeveer 20 jaar geleden was het gebruikelijk. Het HTTP-verzoek zag er als volgt uit:
http://username@example.com/
Of zelfs zo:
http://username:password@example.com/
Dit is geen post. Dit is precies de koppeling. En ja, dat dacht je niet. De login en zelfs het wachtwoord kunnen direct in het http-verzoek worden opgegeven. Ja, zelfs nu kan dat. Daarom schrijf ik dat niemand dit nu normaal doet. Maar er is zo'n mogelijkheid.
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"username",
"password".toCharArray());
}
};
HttpResponse<String> response = HttpClient.newBuilder()
.authenticator(auth).build()
.send(request, BodyHandlers.ofString());
Dit is interessant! Weet je waarom in plaats van “password"
in de code die er staat "password".toCharArray()
?
Omdat de tweede parameter van de constructor PasswordAuthentication
niet String
, maar CharArray
.
En waarom is de tweede parameter dat String
niet CharArray
?
Want om veiligheidsredenen mogen niet alle wachtwoorden als hele string worden opgeslagen, ook niet in je eigen applicatie . Dat wil zeggen dat uw toepassing in het geheugen het wachtwoord niet als een tekenreeks mag opslaan. Zodat als iemand een vochtig geheugen had gemaakt, het wachtwoord er niet uit kon worden gehaald ...
Maar tegelijkertijd kan het wachtwoord via een onveilig HTTP-protocol over de halve wereld worden verzonden :) :) :)
Goed. De wereld is niet perfect.
Via onderstaande links kunt u meer lezen over dit onderwerp: