Asynchrónny HTTP s klientom async-http v Jave

1. Prehľad

AsyncHttpClient (AHC) je knižnica postavená na platforme Netty s cieľom ľahkého vykonávania požiadaviek HTTP a asynchrónneho spracovania odpovedí.

V tomto článku si predstavíme, ako nakonfigurovať a používať klienta HTTP, ako vykonať požiadavku a spracovať odpoveď pomocou AHC.

2. Inštalácia

Najnovšiu verziu knižnice nájdete v úložisku Maven. Mali by sme byť opatrní, aby sme závislosť použili s ID skupiny org.asynchttpclient a nie ten s com.ning:

 org.asynchttpclient async-http-client 2.2.0 

3. Konfigurácia klienta HTTP

Najjednoduchšou metódou získania klienta HTTP je použitie servera Dsl trieda. Statická asyncHttpClient () metóda vracia AsyncHttpClient objekt:

AsyncHttpClient client = Dsl.asyncHttpClient ();

Ak potrebujeme vlastnú konfiguráciu klienta HTTP, môžeme zostaviť AsyncHttpClient objekt pomocou staviteľa DefaultAsyncHttpClientConfig.Builder:

DefaultAsyncHttpClientConfig.Builder clientBuilder = Dsl.config ()

To ponúka možnosť konfigurovať časové limity, server proxy, certifikáty HTTP a mnoho ďalších:

DefaultAsyncHttpClientConfig.Builder clientBuilder = Dsl.config () .setConnectTimeout (500) .setProxyServer (nový ProxyServer (...)); AsyncHttpClient client = Dsl.asyncHttpClient (clientBuilder);

Akonáhle sme nakonfigurovaní a získaní inštanciu klienta HTTP môžeme znovu použiť v celej aplikácii. Nepotrebujeme vytvárať inštancie pre každú požiadavku, pretože interne vytvára nové vlákna a fondy pripojení, čo povedie k problémom s výkonom.

Je tiež dôležité poznamenať, že akonáhle skončíme s používaním klienta, na ktorého by sme mali zavolať Zavrieť() metóda zabránenia úniku pamäte alebo zavesenie zdrojov.

4. Vytvorenie požiadavky HTTP

Existujú dva spôsoby, ako môžeme definovať požiadavku HTTP pomocou AHC:

  • viazaný
  • bez obmedzenia

Z hľadiska výkonu nie je medzi týmito dvoma typmi žiadostí žiadny zásadný rozdiel. Predstavujú iba dve samostatné API, ktoré môžeme použiť na definovanie požiadavky. Viazaná požiadavka je viazaná na klienta HTTP, z ktorého bola vytvorená, a predvolene použije konfiguráciu konkrétneho klienta, pokiaľ nie je uvedené inak.

Napríklad pri vytváraní viazanej požiadavky disableUrlEncoding príznak sa načíta z konfigurácie klienta HTTP, zatiaľ čo pre neviazanú požiadavku je to predvolene nastavené na hodnotu false. Je to užitočné, pretože konfiguráciu klienta je možné zmeniť bez opätovnej kompilácie celej aplikácie pomocou systémových vlastností odovzdaných ako argumenty VM:

java -jar -Dorg.asynchttpclient.disableUrlEncodingForBoundRequests = true

Kompletný zoznam nehnuteľností nájdete na stránke ahc-default.properties spis.

4.1. Viazaná požiadavka

Na vytvorenie viazanej požiadavky používame pomocné metódy z triedy AsyncHttpClient ktoré začínajú predponou „Pripraviť“. Môžeme tiež použiť prepareRequest () metóda, ktorá prijme už vytvorený Žiadosť objekt.

Napríklad prepareGet () metóda vytvorí požiadavku HTTP GET:

BoundRequestBuilder getRequest = client.prepareGet ("// www.baeldung.com");

4.2. Neviazaná požiadavka

Neviazanú požiadavku je možné vytvoriť pomocou RequestBuilder trieda:

Request getRequest = new RequestBuilder (HttpConstants.Methods.GET) .setUrl ("// www.baeldung.com") .build ();

alebo pomocou Dsl pomocná trieda, ktorá skutočne používa RequestBuilder pre konfiguráciu metódy HTTP a URL požiadavky:

Vyžiadajte si getRequest = Dsl.get ("// www.baeldung.com"). Build ()

5. Vykonávanie požiadaviek HTTP

Názov knižnice nám naznačuje, ako je možné vykonať požiadavky. AHC má podporu pre synchrónne aj asynchrónne požiadavky.

Vykonanie žiadosti závisí od jej typu. Pri použití a viazanú požiadavku používame vykonať () metóda z BoundRequestBuilder triedy a keď budeme mať neviazaná požiadavka, vykonáme ju pomocou jednej z implementácií metódy executeRequest () z AsyncHttpClient rozhranie.

5.1. Synchrónne

Knižnica bola navrhnutá tak, aby bola asynchrónna, ale v prípade potreby môžeme simulovať synchrónne volania blokovaním na Budúcnosť objekt. Oboje vykonať () a executeRequest () metódy vrátia a ListenableFuture objekt. Táto trieda rozširuje Java Budúcnosť rozhranie, čím zdedil dostať () metóda, ktorú je možné použiť na blokovanie aktuálneho vlákna, kým nie je dokončená požiadavka HTTP a vráti odpoveď:

Budúca responseFuture = boundGetRequest.execute (); responseFuture.get ();
Budúca responseFuture = client.executeRequest (unboundRequest); responseFuture.get ();

Používanie synchrónnych hovorov je užitočné pri pokuse o ladenie častí nášho kódu, ale neodporúča sa ich používať v produkčnom prostredí, kde asynchrónne vykonávanie vedie k lepšiemu výkonu a priepustnosti.

5.2. Asynchrónne

Keď hovoríme o asynchrónnych vykonaniach, hovoríme tiež o poslucháčoch spracovania výsledkov. Knižnica AHC poskytuje 3 typy poslucháčov, ktoré možno použiť na asynchrónne volania HTTP:

  • AsyncHandler
  • AsyncCompletionHandler
  • ListenableFuture poslucháčov

The AsyncHandler poslucháč ponúka možnosť ovládať a spracovávať volanie HTTP pred jeho dokončením. Jeho použitie dokáže spracovať sériu udalostí súvisiacich s volaním HTTP:

request.execute (new AsyncHandler () {@Override public State onStatusReceived (HttpResponseStatus responseStatus) throws Exception {return null;} @Override public State onHeadersReceived (HttpHeaders headers) throws Exception {return null;} @Override public State onBatusRecePart hodí Exception {return null;} @Override public void onThrowable (Throwable t) {} @Override public Object onCompleted () hodí Exception {return null;}});

The Štát enum nám umožňuje riadiť spracovanie požiadavky HTTP. Návratom Štát.ABORT môžeme zastaviť spracovanie v konkrétnom okamihu a použitím Štát. POKRAČOVAŤ necháme spracovanie dokončiť.

Je dôležité spomenúť, že AsyncHandler nie je bezpečný z hľadiska vlákien a nemal by sa opakovane používať pri vykonávaní súbežných požiadaviek.

AsyncCompletionHandler zdedí všetky metódy z AsyncHandler rozhranie a pridáva onCompleted (odpoveď) pomocná metóda na spracovanie dokončenia hovoru. Všetky ostatné metódy poslucháča sú prepísané na návrat Štát.POKRAČOVAŤ, čím sa kód stane čitateľnejším:

request.execute (new AsyncCompletionHandler () {@Override public Object onCompleted (Response response) throws Exception {return response;}});

The ListenableFuture rozhranie nám umožňuje pridať poslucháčov, ktorí sa spustia po dokončení hovoru HTTP.

Poďme tiež vykonať kód od poslucháčov - pomocou iného spoločného vlákna:

ListenableFuture listenableFuture = klient .executeRequest (unboundRequest); listenableFuture.addListener (() -> {Response response = listenableFuture.get (); LOG.debug (response.getStatusCode ());}, Executors.newCachedThreadPool ());

Okrem toho možnosť pridať poslucháčov, ikona ListenableFuture rozhranie nám umožňuje transformovať Budúcnosť reakcia na a CompletableFuture.

7. Záver

AHC je veľmi výkonná knižnica s mnohými zaujímavými funkciami. Ponúka veľmi jednoduchý spôsob konfigurácie klienta HTTP a schopnosť vykonávať synchrónne aj asynchrónne požiadavky.

Zdrojový kód článku je ako vždy k dispozícii na stránkach GitHub.


$config[zx-auto] not found$config[zx-overlay] not found