Preskúmanie nového klienta HTTP v prostredí Java

1. Úvod

V tomto tutoriáli sa pozrieme na nové inkubácie Java 9 HttpClient.

Až donedávna Java poskytovala iba server HttpURLConnection API - ktoré je nízkej úrovne a nie je známe, že by bolo bohaté na funkcieaUžívatelsky prívetivý.

Preto sa bežne používali niektoré široko používané knižnice tretích strán - napríklad Apache HttpClient, Jetty a Spring's RestTemplate.

2. Počiatočné nastavenie

Modul klienta HTTP je dodávaný ako inkubačný modul v JDK 9 a podporuje HTTP / 2 so spätnou kompatibilitou, ktorá stále umožňuje HTTP / 1.1.

Aby sme ho mohli použiť, musíme definovať náš modul pomocou a modul-info.java súbor, ktorý tiež označuje požadovaný modul na spustenie našej aplikácie:

modul com.baeldung.java9.httpclient {vyžaduje jdk.incubator.httpclient; }

3. Prehľad HTTP API klienta

Na rozdiel od HttpURLConnection, Klient HTTP poskytuje mechanizmy synchrónnych a asynchrónnych požiadaviek.

API sa skladá z 3 základných tried:

  • HttpRequestpredstavuje žiadosť o zaslanie prostredníctvom HttpClient
  • HttpClientsa chová ako kontajner pre konfiguračné informácie spoločné pre viac požiadaviek
  • HttpResponsepredstavuje výsledok HttpRequest hovor

Každú z nich podrobnejšie preskúmame v nasledujúcich častiach. Najskôr sa zamerajme na požiadavku.

4. HttpRequest

HttpRequest, ako meno navrhuje, je objekt, ktorý predstavuje požiadavku, ktorú chceme poslať. Nové inštancie je možné vytvoriť pomocou HttpRequest.Builder.

Získame ho zavolaním HttpRequest.newBuilder (). Staviteľ trieda poskytuje množstvo metód, ktoré môžeme použiť na konfiguráciu našej požiadavky.

Pokryjeme najdôležitejšie.

4.1. Nastavenie URI

Prvá vec, ktorú musíme urobiť pri vytváraní žiadosti, je poskytnúť adresu URL.

Môžeme to urobiť dvoma spôsobmi - pomocou konštruktora pre Staviteľ s URI parametrom alebo metódou volania uri (URI) na Staviteľ inštancia:

HttpRequest.newBuilder (nový URI ("// postman-echo.com/get")) HttpRequest.newBuilder () .uri (nový URI ("// postman-echo.com/get"))

Posledná vec, ktorú musíme nakonfigurovať, aby sme vytvorili základnú požiadavku, je metóda HTTP.

4.2. Zadanie metódy HTTP

Metódu HTTP, ktorú naša požiadavka použije, môžeme definovať zavolaním jednej z metód Staviteľ:

  • ZÍSKAŤ ()
  • POST (BodyProcessor body)
  • PUT (telo procesora)
  • DELETE (BodyProcessor body)

Kryjeme BodyProcessor podrobne, neskôr. Teraz už len tvorme veľmi jednoduchý príklad žiadosti GET:

HttpRequest request = HttpRequest.newBuilder () .uri (new URI ("// postman-echo.com/get")) .GET () .build ();

Táto požiadavka má všetky parametre požadované serverom HttpClient. Niekedy však musíme k našej požiadavke pridať ďalšie parametre; tu sú niektoré dôležité z nich sú:

  • verzia protokolu HTTP
  • hlavičky
  • časový limit

4.3. Nastavenie verzie protokolu HTTP

API plne využíva protokol HTTP / 2 a štandardne ho používa, ale môžeme definovať, ktorú verziu protokolu chceme použiť.

HttpRequest request = HttpRequest.newBuilder () .uri (nový URI ("// postman-echo.com/get")) .version (HttpClient.Version.HTTP_2) .GET () .build ();

Tu je dôležité spomenúť, že klient sa vráti k napr. HTTP / 1.1, ak HTTP / 2 nie je podporovaný.

4.4. Nastavenie hlavičiek

V prípade, že chceme k našej žiadosti pridať ďalšie hlavičky, môžeme použiť poskytnuté metódy staviteľa.

Môžeme to urobiť jedným z dvoch spôsobov:

  • odovzdanie všetkých hlavičiek ako párov kľúč - hodnota do hlavičky () metódou alebo
  • použitím hlavička () metóda pre jednu hlavičku kľúč - hodnota:
HttpRequest request = HttpRequest.newBuilder () .uri (new URI ("// postman-echo.com/get")) .headers ("key1", "value1", "key2", "value2") .GET () .build (); HttpRequest request2 = HttpRequest.newBuilder () .uri (new URI ("// postman-echo.com/get")) .header ("key1", "value1") .header ("key2", "value2"). GET () .build (); 

Posledná užitočná metóda, ktorú môžeme použiť na prispôsobenie našej žiadosti, je časový limit ().

4.5. Nastavenie časového limitu

Poďme si teraz definovať čas, ktorý chceme čakať na odpoveď.

Ak nastavený čas vyprší, a HttpTimeoutException bude vyhodený; predvolený časový limit je nastavený na nekonečno.

Časový limit je možné nastaviť pomocou Trvanie objekt - volaním metódou čas vypršal() v inštancii staviteľa:

HttpRequest request = HttpRequest.newBuilder () .uri (new URI ("// postman-echo.com/get")) .timeout (Duration.of (10, SECONDS)) .GET () .build ();

5. Nastavenie tela žiadosti

Telo môžeme pridať k žiadosti pomocou metód nástroja na tvorbu požiadaviek: POST (BodyProcessor body), PUT (telo procesora) a ODSTRÁNIŤ (BodyProcessor body).

Nové API poskytuje množstvo BodyProcessor implementácie pripravené na použitie, ktoré zjednodušujú odovzdanie tela žiadosti:

  • StringProcessor (číta telo z a String, vytvorené pomocou HttpRequest.BodyProcessor.fromString)
  • InputStreamProcessor (číta telo z InputStream, vytvorené pomocou HttpRequest.BodyProcessor.fromInputStream)
  • ByteArrayProcessor (číta telo z bajtového poľa, vytvorené pomocou HttpRequest.BodyProcessor.fromByteArray)
  • FileProcessor (načíta telo zo súboru na danej ceste, vytvoreného pomocou HttpRequest.BodyProcessor.fromFile)

V prípade, že nepotrebujeme telo, môžeme jednoducho vložiť HttpRequest.noBody ():

HttpRequest request = HttpRequest.newBuilder () .uri (nový URI ("// postman-echo.com/post")) .POST (HttpRequest.noBody ()) .build ();

5.1. StringBodyProcessor

Nastavenie tela žiadosti s ľubovoľným BodyProcessor implementácia je veľmi jednoduchá a intuitívna.

Napríklad, ak chceme zložiť jednoduchý String ako telo môžeme použiť StringBodyProcessor.

Ako sme už spomenuli, tento objekt je možné vytvoriť továrenskou metódou fromString (); trvá to len a String objekt ako argument a vytvorí z neho telo:

HttpRequest request = HttpRequest.newBuilder () .uri (new URI ("// postman-echo.com/post")) .headers ("Content-Type", "text / plain; charset = UTF-8") .POST (HttpRequest.BodyProcessor.fromString ("Vzor tela žiadosti")) .build (); 

5.2. InputStreamBodyProcessor

Ak to chcete urobiť, InputStream musí byť schválené ako a Dodávateľ (aby bol jeho výtvor lenivý), takže je to trochu iné, ako je popísané vyššie StringBodyProcessor.

Je to však tiež celkom priame:

byte [] sampleData = "Vzor žiadosti tela" .getBytes (); HttpRequest request = HttpRequest.newBuilder () .uri (new URI ("// postman-echo.com/post")) .headers ("Content-Type", "text / plain; charset = UTF-8") .POST (HttpRequest.BodyProcessor .fromInputStream (() -> nový ByteArrayInputStream (sampleData))) .build (); 

Všimnite si, ako sme použili jednoduchý ByteArrayInputStream tu; to môže byť samozrejme akékoľvek InputStream implementácia.

5.3. ByteArrayProcessor

Môžeme tiež použiť ByteArrayProcessor a odovzdať pole bajtov ako parameter:

byte [] sampleData = "Vzor žiadosti tela" .getBytes (); HttpRequest request = HttpRequest.newBuilder () .uri (new URI ("// postman-echo.com/post")) .headers ("Content-Type", "text / plain; charset = UTF-8") .POST (HttpRequest.BodyProcessor.fromByteArray (sampleData)) .build ();

5.4. FileProcessor

Na prácu so súborom môžeme využiť poskytnuté FileProcessor; jeho továrenská metóda vezme cestu k súboru ako parameter a vytvorí telo z obsahu:

HttpRequest request = HttpRequest.newBuilder () .uri (new URI ("// postman-echo.com/post")) .headers ("Content-Type", "text / plain; charset = UTF-8") .POST (HttpRequest.BodyProcessor.fromFile (Paths.get ("src / test / resources / sample.txt"))) .build ();

Pokryli sme, ako tvoriť HttpRequest a ako v ňom nastaviť ďalšie parametre.

Teraz je čas sa tomu venovať hlbšie HttpClient triedy, ktorá je zodpovedná za odosielanie žiadostí a prijímanie odpovedí.

6. HttpClient

Všetky žiadosti sa odosielajú pomocou HttpClient ktoré je možné vytvoriť pomocou HttpClient.newBuilder () metódou alebo zavolaním HttpClient.newHttpClient ().

Poskytuje veľa užitočných a popisných metód, ktoré môžeme použiť na vybavenie našej žiadosti / odpovede.

Poďme si tu predstaviť niektoré z nich.

6.1. Nastavenie proxy servera

Môžeme definovať proxy pre pripojenie. Stačí iba zavolať proxy () metóda na a Staviteľ inštancia:

HttpResponse response = HttpClient .newBuilder () .proxy (ProxySelector.getDefault ()) .build () .send (požiadavka, HttpResponse.BodyHandler.asString ()); 

V našom príklade sme použili predvolený systémový proxy server.

6.2. Nastavenie politiky presmerovania

Niekedy sa stránka, na ktorú chceme získať prístup, presunula na inú adresu.

V takom prípade dostaneme stavový kód HTTP 3xx, zvyčajne s informáciami o novom URI. HttpClient môže automaticky presmerovať požiadavku na nový URI, ak nastavíme príslušnú politiku presmerovania.

Môžeme to urobiť pomocou followRedirects () metóda na Staviteľ:

HttpResponse response = HttpClient.newBuilder () .followRedirects (HttpClient.Redirect.ALWAYS) .build () .send (request, HttpResponse.BodyHandler.asString ());

Všetky politiky sú definované a popísané v enum HttpClient.Redirect.

6.3. Nastavenie Authenticator pre pripojenie

An Authenticator je objekt, ktorý vyjednáva poverenia (autentifikácia HTTP) pre pripojenie.

Poskytuje rôzne overovacie schémy (napríklad základné alebo súhrnné overenie). Vo väčšine prípadov overenie vyžaduje na pripojenie k serveru používateľské meno a heslo.

Môžeme použiť Overenie hesla trieda, ktorá je iba držiteľom týchto hodnôt:

HttpResponse response = HttpClient.newBuilder () .authenticator (nový Authenticator () {@Override chránený PasswordAuthentication getPasswordAuthentication () {vrátiť nové PasswordAuthentication ("používateľské meno", "heslo" .toCharArray ());}}). Build () .send (požiadavka, HttpResponse.BodyHandler.asString ());

V príklade vyššie sme zadali hodnoty používateľského mena a hesla ako holý text; samozrejme, vo výrobnom scenári to bude musieť byť iné.

Upozorňujeme, že nie každá žiadosť by mala používať rovnaké používateľské meno a heslo. The Authenticator trieda poskytuje množstvo getXXX (napr. getRequestingSite ()) metódy, ktoré možno použiť na zistenie, aké hodnoty by sa mali poskytnúť.

Teraz preskúmame jednu z najužitočnejších funkcií nového HttpClient - asynchrónne volania na server.

6.4. Odoslať žiadosti - synchronizácia vs. asynchronizácia

Nový HttpClient poskytuje dve možnosti odoslania žiadosti na server:

  • poslať (…) - synchrónne (blokuje sa, kým nepríde odpoveď)
  • sendAsync (…) - asynchrónne (nečaká na odpoveď, neblokuje sa)

Až doteraz boli poslať (...) metóda prirodzene čaká na odpoveď:

HttpResponse response = HttpClient.newBuilder () .build () .send (požiadavka, HttpResponse.BodyHandler.asString ()); 

Toto volanie vráti znak HttpResponse objekt a sme si istí, že ďalšia inštrukcia z nášho toku aplikácie sa vykoná, až keď už bude odpoveď tu.

Má však veľa nevýhod, najmä keď spracovávame veľké množstvo údajov.

Takže teraz môžeme použiť sendAsync (...) metóda - ktorá sa vracia CompletableFeatureasynchrónne spracovať požiadavku:

CompletableFuture response = HttpClient.newBuilder () .build () .sendAsync (požiadavka, HttpResponse.BodyHandler.asString ());

Nové rozhranie API dokáže pracovať aj s viacerými odpoveďami a streamovať orgány požiadaviek a odpovedí:

Zoznam cieľov = Arrays.asList (nový URI ("// postman-echo.com/get?foo1=bar1"), nový URI ("// postman-echo.com/get?foo2=bar2")); HttpClient client = HttpClient.newHttpClient (); Zoznam futures = targets.stream () .map (target -> client .sendAsync (HttpRequest.newBuilder (target) .GET (). build (), HttpResponse.BodyHandler.asString ()) .thenApply (response -> response.body ( ))) .collect (Collectors.toList ());

6.5. Nastavenie Exekútor pre asynchrónne volania

Môžeme tiež definovať Exekútor ktorá poskytuje vlákna, ktoré majú byť použité pri asynchrónnych hovoroch.

Takto môžeme napríklad obmedziť počet vlákien použitých na spracovanie požiadaviek:

ExecutorService executorService = Executors.newFixedThreadPool (2); CompletableFuture response1 = HttpClient.newBuilder () .executor (executorService) .build () .sendAsync (požiadavka, HttpResponse.BodyHandler.asString ()); CompletableFuture response2 = HttpClient.newBuilder () .executor (executorService) .build () .sendAsync (požiadavka, HttpResponse.BodyHandler.asString ());

V predvolenom nastavení je HttpClient používa exekútora java.util.concurrent.Executors.newCachedThreadPool ().

6.6. Definovanie a CookieManager

S novým rozhraním API a nástrojom na tvorbu je ľahké nastaviť a CookieManager pre naše spojenie. Môžeme použiť builderovu metódu cookieManager (CookieManager cookieManager) definovať pre konkrétneho klienta CookieManager.

Poďme si napríklad zadefinovať CookieManager čo vôbec neumožňuje prijímať cookies:

HttpClient.newBuilder () .cookieManager (nový CookieManager (null, CookiePolicy.ACCEPT_NONE)) .build (); 

V prípade nášho CookieManager umožňuje ukladanie súborov cookie, môžeme k nim pristupovať kontrolou CookieManager z našej HttpClient:

httpClient.cookieManager (). get (). getCookieStore () 

Teraz sa zamerajme na poslednú triedu z Http API - HttpResponse.

7. HttpResponse Objekt

The HttpResponse trieda predstavuje odpoveď zo servera. Poskytuje množstvo užitočných metód - ale dve najdôležitejšie sú:

  • statusCode () - vráti stavový kód (typ int) za odpoveď (HttpURLConnection trieda obsahuje možné hodnoty)
  • telo () - vráti telo pre odpoveď (typ návratu závisí od odpovede BodyHandler parameter odovzdaný do poslať () metóda)

Objekt odpovede má inú užitočnú metódu, ktorú si povieme podobne uri (), hlavičky (), prívesy () a verzia ().

7.1. URI objektu odpovede

Metóda uri () na objekte odpovede vráti URI od ktorej sme dostali odpoveď.

Niekedy to môže byť aj iné ako URI v objekte požiadavky, pretože môže dôjsť k presmerovaniu:

assertThat (request.uri () .toString (), equalTo ("// stackoverflow.com")); assertThat (response.uri () .toString (), equalTo ("// stackoverflow.com/"));

7.2. Hlavičky z odpovede

Z odpovede môžeme získať hlavičky volaním metódy hlavičky () na objekte odpovede:

HttpResponse response = HttpClient.newHttpClient () .send (požiadavka, HttpResponse.BodyHandler.asString ()); HttpHeaders responseHeaders = response.headers ();

Vracia sa to HttpHeaders objekt ako návratový typ. Toto je nový typ definovaný v jdk.incubator.http balík, ktorý predstavuje zobrazenie hlavičiek HTTP iba ​​na čítanie.

Má niekoľko užitočných metód, ktoré zjednodušujú hľadanie hodnoty hlavičiek.

7.3. Získajte prívesy od odpovede

Odpoveď HTTP môže obsahovať ďalšie hlavičky, ktoré sa zahrnú za obsah odpovede. Tieto hlavičky sa nazývajú hlavičky prívesu.

Môžeme ich získať volaním metódou prívesy () na HttpResponse:

HttpResponse response = HttpClient.newHttpClient () .send (požiadavka, HttpResponse.BodyHandler.asString ()); CompletableFuture prívesy = response.trailers (); 

Poznač si to prívesy () metóda sa vracia CompletableFuture objekt.

7.4. Verzia odpovede

Metóda verzia () definuje, ktorá verzia protokolu HTTP bola použitá na komunikáciu so serverom.

Pamätajte, že aj keď definujeme, že chceme používať HTTP / 2, server môže odpovedať cez HTTP / 1.1.

Verzia, v ktorej server odpovedal, je uvedená v odpovedi:

HttpRequest request = HttpRequest.newBuilder () .uri (nový URI ("// postman-echo.com/get")) .version (HttpClient.Version.HTTP_2) .GET () .build (); HttpResponse response = HttpClient.newHttpClient () .send (požiadavka, HttpResponse.BodyHandler.asString ()); assertThat (response.version (), equalTo (HttpClient.Version.HTTP_1_1));

8. Klient Java 11 Http

Zásadnou zmenou v Jave 11 bola štandardizácia API klienta HTTP, ktoré implementuje HTTP / 2 a Web Socket. Jeho cieľom je nahradiť dedičstvo HttpUrlConnection triedy, ktorá je v JDK prítomná od veľmi raných rokov Javy.

Zmena bola implementovaná ako súčasť JEP 321.

8.1. Hlavné zmeny v rámci JEP 321

  1. Inkubované HTTP API z Java 9 je teraz oficiálne začlenené do Java SE API. Nové HTTP API nájdete v java.net.HTTP. *
  2. Novšia verzia protokolu HTTP je navrhnutá tak, aby zlepšila celkový výkon odosielania požiadaviek klienta a prijímania odpovedí zo servera. To sa dosiahne zavedením množstva zmien, ako je multiplexovanie toku, kompresia hlavičky a sľuby tlačenia.
  3. Od verzie Java 11 API je teraz plne asynchrónne (predchádzajúca implementácia HTTP / 1.1 bola blokovaná). Asynchrónne volania sú implementované pomocou CompletableFuture.The CompletableFuture implementácia sa stará o použitie každej fázy po dokončení predchádzajúcej, takže celý tento tok je asynchrónny.
  4. Nové rozhranie API klienta HTTP poskytuje štandardný spôsob vykonávania sieťových operácií HTTP s podporou moderných webových funkcií, ako je HTTP / 2, bez potreby pridávania závislostí tretích strán.
  5. Nové API poskytujú natívnu podporu pre HTTP 1.1 / 2 WebSocket. Medzi základné triedy a rozhranie poskytujúce základné funkcie patria:
  • The Trieda HttpClient, java.net.http.HttpClient
  • The HttpRequest trieda, java.net.http.HttpRequest
  • The HttpResponse rozhranie, java.net.http.HttpResponse
  • The WebSocket rozhranie, java.net.http.WebSocket

8.2. Problémy s klientom HTTP Pre Java 11

Existujúce HttpURLConnection API a jeho implementácia mala množstvo problémov:

  • Rozhranie URLConnection API bolo navrhnuté s viacerými protokolmi, ktoré už nie sú funkčné (FTP, gopher atď.).
  • Rozhranie API predchádza protokolu HTTP / 1.1 a je príliš abstraktné.
  • Funguje iba v režime blokovania (t. J. Jedno vlákno na žiadosť / odpoveď).
  • Je veľmi ťažké ho udržiavať.

9. Zmeny v Http klientovi s Java 11

9.1. Zavedenie statických továrenských tried

Nové statické továrenské triedy Vydavateľstvá BodyPublishers, BodySubscribers, a BodyHandlers sa zavádzajú existujúce implementácie BodyPublisher, BodySubscriber a BodyHandler.

Používajú sa na vykonávanie užitočných bežných úloh, ako je napríklad spracovanie tela odpovede ako reťazca alebo streamovanie tela do súboru.

Pre napr. v Pre Java 11 sme museli urobiť niečo také:

HttpResponse response = client.send (požiadavka, HttpResponse.BodyHandler.asString ());

Čo teraz môžeme zjednodušiť ako:

HttpResponse response = client.send (request, BodyHandlers.ofString ());

Pre lepšiu prehľadnosť bol štandardizovaný aj názov statických metód.

Pre napr. metódy názvy ako fromXxx sa používajú, keď ich používame ako adaptéry alebo ako názvy ofXxx keď vytvárame preddefinovaných spracovateľov / predplatiteľov.

9.2. Plynulé metódy pre bežné typy tela

Boli zavedené pohodlné továrenské metódy pre vytvorených vydavateľov a manipulátorov na manipuláciu s bežnými typmi tela.

Pre napr. máme nižšie plynulé metódy vytvárania vydavateľov z bajtov, súborov a reťazcov:

BodyPublishers.ofByteArray BodyPublishers.ofFile BodyPublishers.ofString

Podobne môžeme na vytváranie ovládačov z týchto bežných typov tela používať:

BodyHandlers.ofByteArray BodyHandlers.ofString BodyHandlers.ofFile

9.3. Ďalšie zmeny API

1. S týmto novým API budeme používať BodyHandlers.discarding () a BodyHandlers.replacing (hodnota) namiesto zahodiť (Výmena objektu):

HttpResponse response1 = HttpClient.newHttpClient () .send (požiadavka, BodyHandlers.discarding ());
HttpResponse response1 = HttpClient.newHttpClient () .send (požiadavka, BodyHandlers.replacing (hodnota));

2. Nová metóda ofLines () v BodyHandlers sa pridáva na spracovanie streamovania tela odpovede ako Stream liniek.

3. fromLineSubscriber metóda je pridaná v BodyHandlers triedy, ktorú je možné použiť ako adaptér medzi a BodySubscriber a textové Tok. Odberateľ ktorý analyzuje text riadok po riadku.

4. Pridané nové BodySubscriber.mapping v BodySubscribers trieda, ktorú je možné použiť na mapovanie z jedného typu tela odpovede na druhý aplikáciou danej funkcie na objekt tela.

5. v HttpClient.Redirect, konštanty výčtu SAME_PROTOCOL a ZABEZPEČIŤ politika nahradená novým výčtom NORMÁLNE.

10. Zaobchádzanie so sľubmi v HTTP / 2

Nový klient Http podporuje splnené sľuby PushPromiseHandler rozhranie.

Umožňuje serveru „tlačiť“ obsah klientovi na ďalšie zdroje pri požadovaní primárneho zdroja, čím šetrí viac spiatočných letov a vo výsledku zvyšuje výkon pri vykresľovaní stránky.

Je to skutočne funkcia multiplexovania protokolu HTTP / 2, ktorá nám umožňuje zabudnúť na zväzovanie zdrojov. Pre každý prostriedok server odošle klientovi špeciálnu požiadavku, ktorá sa nazýva push push.

Prijaté prísľuby push, ak existujú, sú dané splnené PushPromiseHandler. PushPromiseHnadler s nulovou hodnotou odmieta akékoľvek sľuby týkajúce sa push.

The HttpClient má preťažený sendAsync metóda, ktorá nám umožňuje splniť tieto sľuby, ako je uvedené v nasledujúcom príklade.

Najprv vytvoríme a PushPromiseHandler:

súkromná statická PushPromiseHandler pushPromiseHandler () {návrat (HttpRequest InitiatingRequest, HttpRequest pushPromiseRequest, funkcia> akceptor) -> {akceptor.apply (BodyHandlers.ofString ()) .thAcAccept (resp -> {System.out.println ("Tlačená odpoveď:" + resp.uri () + ", hlavičky:" + resp. hlavičky) ());}); System.out.println ("Sľubná požiadavka:" + pushPromiseRequest.uri ()); System.out.println ("Sľubná požiadavka:" + pushPromiseRequest.headers ()); }; }

Ďalej použijeme sendAsync metóda na splnenie tohto prísľubu push:

httpClient.sendAsync (pageRequest, BodyHandlers.ofString (), pushPromiseHandler ()) .thAcAc (pageResponse -> {System.out.println ("Kód stavu odpovede stránky:" + pageResponse.statusCode ()); System.out.println ( "Hlavičky odpovedí na stránku:" + pageResponse.headers ()); String responseBody = pageResponse.body (); System.out.println (responseBody);}) .join (); 

11. Záver

V tomto článku sme preskúmali prostredie Java 9 HttpClient API, ktoré poskytuje veľkú flexibilitu a výkonné funkcie. Celý kód použitý v rozhraní Java 9 HttpClient API je k dispozícii na serveri GitHub.

Preskúmali sme tiež novú zmenu v HttpClient Java 11, ktorá štandardizovala inkubačnú HttpClient zavedenú v Jave 9 s výkonnejšími zmenami. Útržky kódu použité pre klienta Java 11 Http Client sú k dispozícii aj na serveri Github.

Poznámka: V príkladoch sme použili vzorové koncové body REST poskytované serverom //postman-echo.com.