Integrácia retrofitu s RxJava

1. Prehľad

Tento článok sa zameriava na to, ako implementovať jednoduchého klienta REST pripraveného na RxJava pomocou retrofitu.

Zostavíme ukážkovú aplikáciu interagujúcu s GitHub API - pomocou štandardného prístupu Retrofit a potom ju vylepšíme pomocou RxJava, aby sme využili výhody reaktívneho programovania.

2. Obyčajná retrofit

Poďme si najskôr vytvoriť príklad s Retrofitom. Použijeme GitHub API na získanie triedeného zoznamu všetkých prispievateľov, ktorí majú v ktoromkoľvek úložisku viac ako 100 príspevkov.

2.1. Maven závislosti

Na začatie projektu s Retrofitom zahrňme tieto Mavenove artefakty:

 com.squareup.retrofit2 retrofit 2.3.0 com.squareup.retrofit2 converter-gson 2.3.0 

Najnovšie verzie nájdete v časti retrofit a converter-gson v úložisku Maven Central.

2.2. Rozhranie API

Vytvorme jednoduché rozhranie:

verejné rozhranie GitHubBasicApi {@GET ("users / {user} / repos") Call listRepos (@Path ("user") String user); @GET ("repos / {user} / {repo} / prispievatelia") Call listRepoContributors (@Path ("user") String user, @Path ("repo") String repo); }

The listRepos () metóda načíta zoznam úložísk pre daného používateľa odovzdaných ako parameter cesty.

The listRepoContributers () metóda načíta zoznam prispievateľov pre daného používateľa a úložisko, oboch odovzdaných ako parametre cesty.

2.3. Logika

Implementujme požadovanú logiku pomocou Retrofitu Volaj objekty a normálny kód Java:

trieda GitHubBasicService {private GitHubBasicApi gitHubApi; GitHubBasicService () {Retrofit retrofit = new Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .build (); gitHubApi = retrofit.create (GitHubBasicApi.class); } List getTopContributors (String userName) throws IOException {List repos = gitHubApi .listRepos (userName) .execute () .body (); repos = repos! = null? repos: Collections.emptyList (); return repos.stream () .flatMap (repo -> getContributors (userName, repo)) .sorted ((a, b) -> b.getContcements () - a.getContcements ()) .map (Contributor :: getName). zreteľný (). roztriedený () .collect (Collectors.toList ()); } private Stream getContributors (reťazec userName, úložisko repo) {Zoznam prispievateľov = null; skúste {prispievatelia = gitHubApi .listRepoContributors (meno používateľa, repo.getName ()) .execute () .body (); } catch (IOException e) {e.printStackTrace (); } prispievatelia = prispievatelia! = null? prispievatelia: Collections.emptyList (); vrátiť prispievateľov.prúd () .filter (c -> c.getContribution ()> 100); }}

3. Integrácia s RxJava

Retrofit nám umožňuje prijímať výsledky hovorov pomocou vlastných obslužných rutín namiesto bežných Volaj objekt pomocou Retrofit Volaj adaptéry. To umožňuje používať RxJava Pozorovateľné a Tekuté látky tu.

3.1. Maven závislosti

Ak chcete použiť adaptér RxJava, musíme zahrnúť tento artefakt Maven:

 com.squareup.retrofit2 adaptér-rxjava 2.3.0 

Najnovšiu verziu skontrolujte adapter-rxjava v centrálnom úložisku Maven.

3.2. Zaregistrujte si adaptér RxJava Call

Pridajme RxJavaCallAdapter staviteľovi:

Retrofit retrofit = new Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .addCallAdapterFactory (RxJavaCallAdapterFactory.create ()) .build ();

3.3. Rozhranie API

V tomto okamihu môžeme zmeniť návratový typ metód rozhrania, ktoré sa majú použiť Pozorovateľné radšej než Volaj. Môžeme použiť aj iné typy Rx Pozorovateľné, Tekutý, Slobodný, Možno, Dokončiteľné.

Upravme naše rozhranie API tak, aby sa dalo používať Pozorovateľné:

verejné rozhranie GitHubRxApi {@GET ("users / {user} / repos") Pozorovateľné listRepos (@Path ("user") String user); @GET („repos / {user} / {repo} / prispievatelia“) Pozorovateľné listRepoContributors (@Path ("user") String user, @Path ("repo") String repo); }

3.4. Logika

Poďme to implementovať pomocou RxJava:

trieda GitHubRxService {private GitHubRxApi gitHubApi; GitHubRxService () {Retrofit retrofit = new Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .addCallAdapterFactory (RxJavaCallAdapterFactory.create (). gitHubApi = retrofit.create (GitHubRxApi.class); } Pozorovateľné getTopContributors (reťazec userName) {return gitHubApi.listRepos (userName) .flatMapIterable (x -> x) .flatMap (repo -> gitHubApi.listRepoContributors (userName, repo.getName ())) .flatMapIterable (x -> x) .filter (c -> c.getContribution ()> 100). roztriedené ((a, b) -> b.getContcements () - a.getContribution ()) .map (Contributor :: getName) .distinct (); }}

4. Záver

Pri porovnaní kódu pred a po použití RxJava sme zistili, že bol vylepšený nasledujúcimi spôsobmi:

  • Reaktívne - pretože naše dáta teraz prúdia v prúdoch, umožňuje nám to asynchrónne spracovanie toku s neblokujúcim spätným tlakom
  • Jasné - kvôli svojej deklaratívnej povahe
  • Stručne - celú operáciu možno predstaviť ako jeden operačný reťazec

Celý kód v tomto článku je k dispozícii na GitHub.

Balík com.baeldung.retrofit.základný obsahuje základný príklad dodatočnej inštalácie balíka com.baeldung.retrofit.rx obsahuje príklad retrofitu s integráciou RxJava.


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