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.