Aszinkron HTTP az async-http-klienssel Java-ban

1. Áttekintés

Az AsyncHttpClient (AHC) a Netty tetejére épülő könyvtár, amelynek célja a HTTP-kérések egyszerű végrehajtása és a válaszok aszinkron feldolgozása.

Ebben a cikkben bemutatjuk a HTTP kliens konfigurálását és használatát, a kérés végrehajtását és a válasz AHC használatával történő feldolgozását.

2. Beállítás

A könyvtár legújabb verziója megtalálható a Maven tárházban. Óvatosan kell használnunk a függőséget a csoportazonosítóval org.asynchttpclient és nem az, akivel com.ning:

 org.asynchttpclient async-http-kliens 2.2.0 

3. HTTP kliens konfiguráció

A HTTP-ügyfél megszerzésének legegyszerűbb módja a Dsl osztály. A statikus asyncHttpClient () metódus egy AsyncHttpClient tárgy:

AsyncHttpClient kliens = Dsl.asyncHttpClient ();

Ha a HTTP kliens egyedi konfigurációjára van szükségünk, elkészíthetjük a AsyncHttpClient objektumot az építő segítségével DefaultAsyncHttpClientConfig.Builder:

DefaultAsyncHttpClientConfig.Builder clientBuilder = Dsl.config ()

Ez lehetőséget nyújt időtúllépés, proxy szerver, HTTP tanúsítványok és még sok más konfigurálására:

DefaultAsyncHttpClientConfig.Builder clientBuilder = Dsl.config () .setConnectTimeout (500) .setProxyServer (új ProxyServer (...)); AsyncHttpClient kliens = Dsl.asyncHttpClient (clientBuilder);

Miután konfiguráltuk és megszereztük a HTTP kliens egy példányát újra felhasználhatjuk az egész alkalmazáson keresztül. Nem kell minden kéréshez létrehoznunk egy példányt, mert belül új szálakat és kapcsolati készleteket hoz létre, amelyek teljesítményproblémákhoz vezetnek.

Fontos megjegyezni ezt is amint befejeztük az ügyfél használatát, hívnunk kell Bezárás() módszer a memória szivárgásának megakadályozására vagy függő források.

4. HTTP kérés létrehozása

Kétféle módon határozhatunk meg HTTP kérést AHC használatával:

  • összekötött
  • nincs kötve

A két kéréstípus között nincs nagy különbség a teljesítmény szempontjából. Csak két külön API-t képviselnek, amelyek segítségével meghatározhatunk egy kérést. A kötött kérés ahhoz a HTTP-ügyfélhez van kötve, amelyből létrehozták, és alapértelmezés szerint az adott ügyfél konfigurációját használja, ha másként nincs meghatározva.

Például kötött lekérés létrehozásakor a disableUrlEncoding A flag beolvasásra kerül a HTTP kliens konfigurációjából, míg egy kötetlen kérés esetén ez alapértelmezés szerint hamis. Ez azért hasznos, mert az ügyfél konfigurációja megváltoztatható az egész alkalmazás újrafordítása nélkül a virtuális gép argumentumaként átadott rendszer tulajdonságok felhasználásával:

java -jar -Dorg.asynchttpclient.disableUrlEncodingForBoundRequests = true

A tulajdonságok teljes listája megtalálható a ahc- alapértelmezett.tulajdonságok fájl.

4.1. Kötött kérés

Összekötött kérés létrehozásához az osztály segítő metódusait használjuk AsyncHttpClient amelyek az előtaggal kezdődnek "készít". Használhatjuk a preparRequest () egy már létrehozott metódust kap Kérés tárgy.

Például a PreparGet () módszer létrehoz egy HTTP GET kérést:

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

4.2. Nincs korlátozás

Kötetlen kérelem létrehozható a RequestBuilder osztály:

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

vagy a Dsl helper osztály, amely valójában a RequestBuilder a HTTP módszer és a kérés URL konfigurálásához:

Request getRequest = Dsl.get ("// www.baeldung.com"). Build ()

5. HTTP kérések végrehajtása

A könyvtár neve tippet ad a kérések végrehajtásának módjáról. Az AHC támogatja mind a szinkron, mind az aszinkron kéréseket.

A kérelem végrehajtása annak típusától függ. Ha a kötött kérést használjuk végrehajtani () módszer a BoundRequestBuilder osztály és amikor van egy kötetlen kérés, az executeRequest () metódus egyik megvalósításával hajtjuk végre AsyncHttpClient felület.

5.1. Szinkron módon

A könyvtárat aszinkronnak tervezték, de szükség esetén szimulálhatjuk a szinkron hívásokat a Jövő tárgy. Mindkét végrehajtani () és executeRequest () módszerek adják vissza a Hallható jövő tárgy. Ez az osztály kiterjeszti a Java-t Jövő interfész, így örökli a kap() metódus, amely az aktuális szál blokkolására használható, amíg a HTTP-kérés be nem fejeződik és válaszot ad vissza:

Jövőbeli válaszFuture = boundGetRequest.execute (); responseFuture.get ();
Jövőbeli válaszFuture = client.executeRequest (kötetlenRequest); responseFuture.get ();

A szinkron hívások használata akkor hasznos, amikor megpróbáljuk hibakeresni a kódunk egyes részeit, de nem ajánlott olyan termelési környezetben használni, ahol az aszinkron végrehajtások jobb teljesítményhez és átviteli sebességhez vezetnek.

5.2. Aszinkron módon

Amikor aszinkron kivégzésekről beszélünk, akkor hallgatókról is beszélünk az eredmények feldolgozásához. Az AHC könyvtár 3 típusú hallgatót kínál, amelyek aszinkron HTTP hívásokhoz használhatók:

  • AsyncHandler
  • AsyncCompletionHandler
  • Hallható jövő hallgatók

A AsyncHandler A hallgató lehetőséget kínál a HTTP-hívás vezérlésére és feldolgozására, még annak befejezése előtt. Használata képes kezelni a HTTP-hívással kapcsolatos eseménysorozatot:

request.execute (új AsyncHandler () {@Override nyilvános State onStatusReceived (HttpResponseStatus responseStatus) dob Kivétel {return null;} @Override nyilvános State onHeadersReceived (HttpHeaders fejlécek) dob Kivétel {return null;} @Override nyilvános State onBodyPartReceived (HttpResponseBodyPart bodypart) dobja a Kivételt {return null;} @Orride public void onThrowable (Throwable t) {} @Orride public Object onCompleted () dob Kivételt {return null;}});

A Állapot Az enum lehetővé teszi számunkra a HTTP-kérés feldolgozásának ellenőrzését. Visszatéréssel Állam.ABORT leállíthatjuk a feldolgozást egy adott pillanatban és használatával Állam.FOLYTATÁS hagyjuk a feldolgozást befejezni.

Fontos megemlíteni, hogy a AsyncHandler nem biztonságos a szálak számára, és nem szabad újrafelhasználni egyidejű kérések végrehajtásakor.

AsyncCompletionHandler örököl minden módszert a AsyncHandler felületet, és hozzáadja a onCompleted (Válasz) segítő módszer a hívás befejezésének kezelésére. Az összes többi hallgatói módszert felülírják a visszatéréshez Állapot.FOLYTATÁS, így olvashatóbbá téve a kódot:

request.execute (new AsyncCompletionHandler () {@Orride public Object onCompleted (Response response) dobja a Kivételt {return response;}});

A Hallható jövő Az interfész lehetővé teszi számunkra a hallgatók felvételét, amelyek a HTTP-hívás befejeztével futnak.

Végezzük el a kódot a hallgatóktól - egy másik szálkészlet használatával:

ListenableFuture listenableFuture = kliens .executeRequest (kötetlenRequest); listenableFuture.addListener (() -> {Response response = listenableFuture.get (); LOG.debug (response.getStatusCode ());}, Executors.newCachedThreadPool ());

Emellett a hallgatók felvételének lehetősége, a Hallható jövő felület segítségével átalakíthatjuk a Jövő válasz a CompletableFuture.

7. Következtetés

Az AHC nagyon hatékony könyvtár, sok érdekes funkcióval. A HTTP kliens konfigurálásának nagyon egyszerű módját kínálja, és képes szinkron és aszinkron kérések végrehajtására is.

Mint mindig, a cikk forráskódja elérhető a GitHubon.


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