Asinkroni HTTP s async-http-klijentom u Javi

1. Pregled

AsyncHttpClient (AHC) je biblioteka koja se gradi na Netty-u, sa svrhom lakog izvršavanja HTTP zahtjeva i asinhrone obrade odgovora.

U ovom ćemo članku predstaviti kako konfigurirati i koristiti HTTP klijent, kako izvršiti zahtjev i obraditi odgovor pomoću AHC-a.

2. Postavljanje

Najnovija verzija knjižnice može se naći u spremištu Maven. Trebali bismo biti oprezni pri korištenju ovisnosti s ID-om grupe org.asynchttpclient a ne onaj sa com.ning:

 org.asynchttpclient async-http-client 2.2.0 

3. Konfiguracija HTTP klijenta

Najjednostavnija metoda za dobivanje HTTP klijenta je upotreba Dsl razred. Statički asyncHttpClient () metoda vraća an AsyncHttpClient objekt:

AsyncHttpClient klijent = Dsl.asyncHttpClient ();

Ako nam treba prilagođena konfiguracija HTTP klijenta, možemo izraditi AsyncHttpClient objekt pomoću graditelja DefaultAsyncHttpClientConfig.Builder:

DefaultAsyncHttpClientConfig.Builder clientBuilder = Dsl.config ()

Ovo nudi mogućnost konfiguriranja vremenskih ograničenja, proxy poslužitelja, HTTP certifikata i mnogih drugih:

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

Nakon što smo konfigurirali i dobili instancu HTTP klijenta možemo je ponovno koristiti u cijeloj aplikaciji. Ne trebamo stvarati instancu za svaki zahtjev, jer interno stvara nove niti i spremišta veza, što će dovesti do problema s izvedbom.

Također, važno je to napomenuti nakon što završimo s korištenjem klijenta kojeg bismo trebali nazvati Zatvoriti() metoda za sprečavanje curenja memorije ili vješanje resursa.

4. Stvaranje HTTP zahtjeva

Postoje dvije metode u kojima možemo definirati HTTP zahtjev pomoću AHC:

  • vezani
  • nevezano

Nema velike razlike između dvije vrste zahtjeva u pogledu izvedbe. Oni predstavljaju samo dva odvojena API-ja pomoću kojih možemo definirati zahtjev. Vezani zahtjev vezan je za HTTP klijent iz kojeg je stvoren i po defaultu će koristiti konfiguraciju tog određenog klijenta ako nije drugačije naznačeno.

Na primjer, pri stvaranju vezanog zahtjeva, disableUrlEncoding zastavica se čita iz konfiguracije HTTP klijenta, dok je za nevezani zahtjev to po defaultu postavljeno na false. To je korisno jer se konfiguracija klijenta može promijeniti bez ponovnog prevođenja cijele aplikacije pomoću svojstava sustava prosljeđenih kao VM argumenti:

java -jar -Dorg.asynchttpclient.disableUrlEncodingForBoundRequests = true

Cjelovit popis nekretnina možete pronaći na ahc-default.properties datoteka.

4.1. Vezani zahtjev

Da bismo stvorili vezani zahtjev, koristimo pomoćne metode iz klase AsyncHttpClient koji počinju s prefiksom "pripremiti". Također, možemo koristiti pripremaRequest () metoda koja prima već stvorenu Zahtjev objekt.

Na primjer, pripremite se () metoda stvorit će HTTP GET zahtjev:

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

4.2. Neograničeni zahtjev

Nevezani zahtjev može se stvoriti pomoću RequestBuilder razred:

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

ili pomoću Dsl pomoćna klasa, koja zapravo koristi RequestBuilder za konfiguriranje HTTP metode i URL-a zahtjeva:

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

5. Izvršenje HTTP zahtjeva

Ime biblioteke daje nam savjet o načinu izvršavanja zahtjeva. AHC ima podršku i za sinkrone i za asinkrone zahtjeve.

Izvršenje zahtjeva ovisi o njegovoj vrsti. Kada koristite vezani zahtjev koristimo izvršiti() metoda iz BoundRequestBuilder razreda i kad imamo nevezani zahtjev izvršit ćemo ga pomoću jedne od implementacija metode executeRequest () iz AsyncHttpClient sučelje.

5.1. Sinkrono

Biblioteka je dizajnirana da bude asinkrona, ali po potrebi možemo simulirati sinkrone pozive blokiranjem na Budućnost objekt. Oba izvršiti() i executeRequest () metode vraćaju a Slušljivo u budućnosti objekt. Ova klasa proširuje Javu Budućnost sučelje, nasljeđujući tako dobiti() metoda koja se može koristiti za blokiranje trenutne niti dok se HTTP zahtjev ne dovrši i vrati odgovor:

Budući responseFuture = boundGetRequest.execute (); responseFuture.get ();
Budući responseFuture = client.executeRequest (unboundRequest); responseFuture.get ();

Korištenje sinkronih poziva korisno je prilikom pokušaja otklanjanja pogrešaka u dijelovima koda, ali ne preporučuje se upotreba u proizvodnom okruženju u kojem asinkrono izvršavanje dovodi do boljih performansi i propusnosti.

5.2. Asinkrono

Kada govorimo o asinkronim smaknućima, govorimo i o slušateljima za obradu rezultata. AHC knjižnica nudi 3 vrste slušatelja koji se mogu koristiti za asinkrone HTTP pozive:

  • AsyncHandler
  • AsyncCompletionHandler
  • Slušljivo u budućnosti slušatelji

The AsyncHandler Slušatelj nudi mogućnost upravljanja i obrade HTTP poziva prije nego što je dovršen. Korištenjem se može nositi s nizom događaja povezanih s HTTP pozivom:

request.execute (new AsyncHandler () {@Override javni State onStatusReceived (HttpResponseStatus responseStatus) baca Iznimka {povratni nula;} @Override javnog State onHeadersReceived (HttpHeaders zaglavlja) baca Iznimka {povratni nula;} @Override javnog State onBodyPartReceived (HttpResponseBodyPart bodyPart) baca Exception {return null;} @Override public void onThrowable (Throwable t) {} @Override public Object onCompleted () baca Exception {return null;}});

The država enum nam omogućuje kontrolu obrade HTTP zahtjeva. Povratkom Država.ABORT možemo zaustaviti obradu u određenom trenutku i pomoću Država.NASTAVAK prepuštamo obradi da završi.

Važno je napomenuti da AsyncHandler nije zaštićen od niti i ne bi se trebao ponovno koristiti prilikom izvršavanja istodobnih zahtjeva.

AsyncCompletionHandler nasljeđuje sve metode iz AsyncHandler sučelje i dodaje onCompleted (Odgovor) pomoćna metoda za rukovanje završetkom poziva. Sve ostale metode slušatelja su nadjačane da bi se vratile Država.NASTAVITE, čineći tako kôd čitljivijim:

request.execute (novi AsyncCompletionHandler () {@Preuzmi javni objekt onCompleted (odgovor odgovora) baca izuzetak {return response;}});

The Slušljivo u budućnosti sučelje nam omogućuje dodavanje slušatelja koji će se izvoditi kad se HTTP poziv dovrši.

Također, izvršimo kôd od slušatelja - pomoću drugog spremišta niti:

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

Osim toga, mogućnost dodavanja slušatelja, Slušljivo u budućnosti sučelje omogućuje nam transformiranje Budućnost odgovor na a CompletableFuture.

7. Zaključak

AHC je vrlo moćna knjižnica s puno zanimljivih značajki. Nudi vrlo jednostavan način konfiguriranja HTTP klijenta i mogućnost izvršavanja sinkronih i asinkronih zahtjeva.

Kao i uvijek, izvorni kôd članka dostupan je na GitHubu.