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 BodyHandlersezek? 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 bodyvá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 BodyHandlersadott á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 301vagy 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:

HTTP hitelesítés

A HTTP hitelesítés megértése