Integrering av ettermontering med RxJava

1. Oversikt

Denne artikkelen fokuserer på hvordan du implementerer en enkel RxJava-klar REST-klient ved hjelp av ettermontering.

Vi bygger et eksempel på et program som samhandler med GitHub API - ved å bruke standard ettermonteringsmetode, og deretter forbedrer vi det ved hjelp av RxJava for å utnytte fordelene med reaktiv programmering.

2. Vanlig ettermontering

La oss først bygge et eksempel med Retrofit. Vi bruker GitHub APIer for å få en sortert liste over alle bidragsyterne som har mer enn 100 bidrag i et hvilket som helst depot.

2.1. Maven avhengigheter

For å starte et prosjekt med Retrofit, la oss ta med disse Maven-gjenstandene:

 com.squareup.retrofit2 ettermontering 2.3.0 com.squareup.retrofit2 omformer-gson 2.3.0 

For de nyeste versjonene, ta en titt på ettermontering og converter-gson på Maven Central repository.

2.2. API-grensesnitt

La oss lage et enkelt grensesnitt:

offentlig grensesnitt GitHubBasicApi {@GET ("brukere / {bruker} / repos") AnropslisteRepos (@Path ("bruker") Strengbruker); @GET ("repos / {user} / {repo} / bidragsytere") AnropslisteRepoContributors (@Path ("bruker") Strengbruker, @Path ("repo") Strengreposisjon); }

De listRepos () metoden henter en liste over arkiver for en gitt bruker som er sendt som en stiparameter.

De listRepoContributers () metoden henter en liste over bidragsytere for en gitt bruker og depot, begge sendt som baneparametere.

2.3. Logikk

La oss implementere den nødvendige logikken ved hjelp av ettermontering Anrop objekter og vanlig Java-kode:

klasse 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) kaster IOException {List repos = gitHubApi .listRepos (userName) .execute () .body (); repos = repos! = null? repoer: Collections.emptyList (); returner repos.stream () .flatMap (repo -> getContributors (userName, repo)) .sorted ((a, b) -> b.getContributions () - a.getContributions ()) .map (Contributor :: getName). distinkt () .sortert () .collect (Collectors.toList ()); } private Stream getContributors (String userName, Repository repo) {List contributors = null; prøv {contributors = gitHubApi .listRepoContributors (userName, repo.getName ()) .execute () .body (); } fange (IOException e) {e.printStackTrace (); } bidragsytere = bidragsytere! = null? bidragsytere: Collections.emptyList (); returnere bidragsytere.stream () .filter (c -> c.getContributions ()> 100); }}

3. Integrering med RxJava

Ettermontering lar oss motta samtaleresultater med tilpassede håndterere i stedet for det normale Anrop objekt ved hjelp av ettermontering Anrop adaptere. Dette gjør det mulig å bruke RxJava Observerbare og Flytbare stoffer her.

3.1. Maven avhengigheter

For å bruke RxJava-adapter, må vi ta med denne Maven-gjenstanden:

 com.squareup.retrofit2 adapter-rxjava 2.3.0 

For den siste versjonen, vennligst sjekk adapter-rxjava i Maven sentrale arkiv.

3.2. Registrer RxJava Call Adapter

La oss legge til RxJavaCallAdapter til byggherren:

Ettermontering ettermontering = ny Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .addCallAdapterFactory (RxJavaCallAdapterFactory.create ()) .build ();

3.3. API-grensesnitt

På dette punktet kan vi endre returtypen for grensesnittmetoder som skal brukes Observerbar heller enn Anrop. Vi kan bruke andre Rx-typer som Observerbar, Flytbar, Enkelt, Kan være, Fullførbar.

La oss endre API-grensesnittet vårt for å bruke Observerbar:

offentlig grensesnitt GitHubRxApi {@GET ("brukere / {bruker} / repoer") Observerbar listRepos (@Path ("bruker") Strengbruker); @GET ("repos / {user} / {repo} / bidragsytere") Observerbar listRepoContributors (@Path ("bruker") Stringbruker, @Path ("repo") String repo); }

3.4. Logikk

La oss implementere det ved hjelp av RxJava:

klasse GitHubRxService {privat GitHubRxApi gitHubApi; GitHubRxService () {Retrofit retrofit = new Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .addCallAdapterFactory (RxJavaCallAdapterFactory.create ()) .build (); gitHubApi = retrofit.create (GitHubRxApi.class); } Observable getTopContributors (String userName) {return gitHubApi.listRepos (userName) .flatMapIterable (x -> x) .flatMap (repo -> gitHubApi.listRepoContributors (userName, repo.getName ())) .flatMapIterable (x -> .filter (c -> c.getContributions ()> 100) .sorted ((a, b) -> b.getContributions () - a.getContributions ()) .map (Contributor :: getName) .distinct (); }}

4. Konklusjon

Sammenligning av koden før og etter bruk av RxJava, har vi funnet ut at den er forbedret på følgende måter:

  • Reaktiv - ettersom dataene våre nå strømmer i strømmer, gjør det oss i stand til å gjøre asynkron strømbehandling med ikke-blokkerende mottrykk
  • Klar - på grunn av sin deklarative natur
  • Kortfattet - hele operasjonen kan representeres som en operasjonskjede

All koden i denne artikkelen er tilgjengelig på GitHub.

Pakken com.baeldung.retrofit.basic inneholder det grunnleggende ettermonteringseksemplet mens pakken com.baeldung.retrofit.rx inneholder ettermonteringseksemplet med RxJava-integrasjon.