4.1 A send() metódus, BodyHandlers
Befejezte a http kérés létrehozásának megtanulását , így továbbléphet a legfontosabb dologra - a kérés elküldésére. A legegyszerűbb esetben ezt könnyű megtenni:
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() );
És mik BodyHandlers
ezek? Mit gondolsz? Kérést küldött, ami azt jelenti, hogy választ kell kapnia - http response
. És ez a válasz a következőket tartalmazhatja response body
: egy karakterlánc, egy fájl, egy bájttömb, egy InputStream.
Igen, igen, ez így van. Csakúgy, mint a kérés létrehozásakor, itt is meg kell adni a response body
válasz típusát. Összesen 8 darab lehet:
BodyHandlers.ofByteArray
BodyHandlers.ofString
BodyHandlers.ofFile
BodyHandlers.discarding
BodyHandlers.replacing
BodyHandlers.ofLines
BodyHandlers.fromLineSubscriber
Attól függően, hogy milyen típust BodyHandlers
adott át a metódusnak send()
, az ilyen eredménytípust ad vissza. Példa:
// 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());
Ha válaszként fájlt kell küldeni Önnek, akkor BodyHandlers.ofFile()
át kell adnia a helyi fájl nevét a metódusnak, ahol azt a HttpClient objektum elmenti.
4.2 FollowRedirects() metódus
A kérés elküldésekor megadhatja azt is, hogy a HttpClient mit tegyen, ha a szerver válaszként küld 301
vagy 302
(ideiglenes vagy állandó átirányítást) küld. Képzelje el, hogy a szerver küldött egy kódot 302
, és Önnek a következőket kell tennie: nyomon követni ezt a helyzetet, új URL-t kapni a válaszból, és el kell küldenie a kérést az új címre.
Nem nagyon szeretném ezt megtenni, főleg, ha figyelembe vesszük, hogy ez a helyzet gyakori, és már régóta automatizált minden http kliensben. Ebben a HttpClientben is csak meg kell adnia, hogy a kérés elküldésekor melyik átirányítási módot választja.
HttpResponse response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS )
.build()
.send(request, BodyHandlers.ofString());
Csak 3 lehetőség van az átirányításra:
- MINDIG – mindig;
- SOHA – soha;
- NORMÁL - mindig, kivéve HTTPS -> HTTP.
Amint látja, itt nincs sok lehetőség, de mindig jobb, ha van lehetőség testreszabni, mint nem.
4.4 A proxy() metódus
Van még néhány hasznos, de nem gyakran használt lehetőség. Addig nincs rájuk szükséged, amíg nincs rájuk :)
Az első a proxy. A hétköznapi életben nem gyakran találkozunk velük, de sok nagyvállalat rendelkezik bonyolult internetes forgalombiztonsági rendszerrel, és ebből következően különféle proxy beállításokkal.
Nos, persze, a szoftvere, amely valahol egy ilyen vállalat gyomrában fog működni, egyszer szembesül azzal a ténnyel, hogy proxyt kell használnia. Ezért jó, hogy itt is van ilyen lehetőség.
A proxy beállítása nagyon egyszerű – egy példa:
HttpResponse<String> response = HttpClient.newBuilder()
.proxy( ProxySelector.getDefault())
.build()
.send(request, BodyHandlers.ofString());
Itt az alapértelmezett proxy lett kiválasztva, de érdemes beállítani a sajátját:
HttpResponse response = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
.build()
.send(request, BodyHandlers.ofString());
Nem fogjuk figyelembe venni, hogy pontosan hogyan kell proxyval dolgozni, mivel ez nem tartozik ennek a kurzusnak a körébe.
4.5 hitelesítő()
És még egy fontos szempont. A HTTP protokoll támogatja a hitelesítést. Pontosan protokoll szinten.
Ma ezt a megközelítést szinte nem alkalmazzák, de körülbelül 20 évvel ezelőtt általános volt. A HTTP-kérés így nézett ki:
http://username@example.com/
Vagy akár így:
http://username:password@example.com/
Ez nem levél. Pontosan ez a link. És igen, nem így gondoltad. A bejelentkezési név, sőt a jelszó is megadható közvetlenül a http kérésben. Igen, még most is megteheti. Ezért írom, hogy ezt most senki sem szokott csinálni. De van ilyen lehetőség.
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());
Ez érdekes! Tudod miért “password"
a kód helyett azt írja ki "password".toCharArray()
?
Mert a konstruktor második paramétere PasswordAuthentication
nem String
, hanem CharArray
.
És miért nem a második paraméter String
, mi CharArray
?
Mivel az összes jelszót nem szabad biztonsági okokból egész karakterláncként tárolni, még a saját alkalmazásában sem . Ez azt jelenti, hogy az alkalmazás a memóriájában nem tárolhatja a jelszót karakterláncként. Úgy, hogy ha valaki nedves memóriát csinált, a jelszót nem lehetett kihúzni belőle ...
De ugyanakkor a jelszót egy nem biztonságos HTTP protokollon keresztül át lehet vinni a fél világba :) :) :)
Jól. A világ nem tökéletes.
A témáról bővebben az alábbi linkeken olvashat: