Integrering af eftermontering med RxJava

1. Oversigt

Denne artikel fokuserer på, hvordan du implementerer en simpel RxJava-klar REST-klient ved hjælp af Retrofit.

Vi bygger et eksempel på en applikation, der interagerer med GitHub API - ved hjælp af standardretrofit-metoden, og derefter forbedrer vi den ved hjælp af RxJava for at udnytte fordelene ved reaktiv programmering.

2. Almindelig eftermontering

Lad os først bygge et eksempel med Retrofit. Vi bruger GitHub API'erne til at få en sorteret liste over alle bidragydere, der har mere end 100 bidrag i ethvert lager.

2.1. Maven afhængigheder

For at starte et projekt med Retrofit, lad os medtage disse Maven-artefakter:

 com.squareup.retrofit2 eftermontering 2.3.0 com.squareup.retrofit2 konverter-gson 2.3.0 

For de nyeste versioner, se eftermontering og converter-gson på Maven Central repository.

2.2. API-interface

Lad os oprette en simpel grænseflade:

offentlig grænseflade GitHubBasicApi {@GET ("brugere / {bruger} / repos") OpkaldslisteRepos (@Path ("bruger") Stringbruger); @GET ("repos / {user} / {repo} / contributors") OpkaldslisteRepoContributors (@Path ("bruger") Stringbruger, @Path ("repo") String repo); }

Det listeRepos () metoden henter en liste over opbevaringssteder for en given bruger, der er sendt som en stiparameter.

Det listRepoContributers () metode henter en liste over bidragsydere til en given bruger og lager, begge videregivet som stiparametre.

2.3. Logik

Lad os implementere den krævede logik ved hjælp af Retrofit Opkald objekter og normal Java-kode:

klasse GitHubBasicService {privat GitHubBasicApi gitHubApi; GitHubBasicService () {Retrofit retrofit = ny Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .build (); gitHubApi = retrofit.create (GitHubBasicApi.class); } Liste getTopContributors (String brugernavn) kaster IOException {List repos = gitHubApi .listRepos (userName) .execute () .body (); repos = repos! = null? repos: Collections.emptyList (); returner repos.stream () .flatMap (repo -> getContributors (userName, repo)) .sorted ((a, b) -> b.getContributions () - a.getContributions ()) .map (Contributor :: getName). tydelig () .sorteret () .collect (Collectors.toList ()); } privat stream getContributors (String userName, Repository repo) {List contributors = null; prøv {contributors = gitHubApi .listRepoContributors (userName, repo.getName ()) .execute () .body (); } fange (IOException e) {e.printStackTrace (); } bidragydere = bidragydere! = null? bidragydere: Collections.emptyList (); returnere bidragydere.stream () .filter (c -> c.getContributions ()> 100); }}

3. Integrering med RxJava

Eftermontering lader os modtage opkaldsresultater med brugerdefinerede håndterere i stedet for det normale Opkald objekt ved hjælp af eftermontering Opkald adaptere. Dette gør det muligt at bruge RxJava Observerbare og Flowables her.

3.1. Maven afhængigheder

For at bruge RxJava-adapteren skal vi medtage denne Maven-artefakt:

 com.squareup.retrofit2 adapter-rxjava 2.3.0 

For den nyeste version, se venligst adapter-rxjava i Maven central repository.

3.2. Registrer RxJava Call Adapter

Lad os tilføje RxJavaCallAdapter til bygherren:

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

3.3. API-interface

På dette tidspunkt kan vi ændre returtypen af ​​interface-metoder, der skal bruges Observerbar hellere end Opkald. Vi bruger muligvis andre Rx-typer som f.eks Observerbar, Flydbar, Enkelt, måske, Kompletabel.

Lad os ændre vores API-interface, der skal bruges Observerbar:

offentlig grænseflade GitHubRxApi {@GET ("brugere / {bruger} / repos") Observerbar listRepos (@Path ("bruger") Stringbruger); @GET ("repos / {user} / {repo} / contributors") Observerbar listRepoContributors (@Path ("bruger") Stringbruger, @Path ("repo") String repo); }

3.4. Logik

Lad os implementere det ved hjælp af 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. Konklusion

Ved at sammenligne koden før og efter brug af RxJava har vi fundet ud af, at den er blevet forbedret på følgende måder:

  • Reaktiv - da vores data nu strømmer i strømme, gør det os i stand til at udføre asynkron strømbehandling med ikke-blokerende modtryk
  • Klart - på grund af dets deklarative karakter
  • Kortfattet - hele operationen kan repræsenteres som en operationskæde

Al koden i denne artikel er tilgængelig på GitHub.

Pakken com.baeldung.retrofit.basic indeholder det grundlæggende eftermonteringseksempel, mens pakken com.baeldung.retrofit.rx indeholder eftermonteringseksemplet med RxJava-integration.