Retrofit integreren met RxJava

1. Overzicht

Dit artikel gaat over het implementeren van een eenvoudige RxJava-ready REST Client met Retrofit.

We zullen een voorbeeldtoepassing bouwen die communiceert met de GitHub API - met behulp van de standaard Retrofit-benadering, en dan zullen we deze verbeteren met RxJava om de voordelen van Reactive Programming te benutten.

2. Gewoon retrofit

Laten we eerst een voorbeeld bouwen met Retrofit. We gebruiken de GitHub-API's om een ​​gesorteerde lijst te krijgen van alle bijdragers die meer dan 100 bijdragen hebben in een opslagplaats.

2.1. Afhankelijkheden van Maven

Laten we, om een ​​project met Retrofit te starten, deze Maven-artefacten opnemen:

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

Kijk voor de nieuwste versies bij retrofit en converter-gson op de Maven Central-repository.

2.2. API-interface

Laten we een eenvoudige interface maken:

openbare interface GitHubBasicApi {@GET ("gebruikers / {gebruiker} / repos") Oproep listRepos (@Path ("gebruiker") String-gebruiker); @GET ("repos / {user} / {repo} / contributors") Oproep listRepoContributors (@Path ("user") String-gebruiker, @Path ("repo") String-repo); }

De lijstRepos () methode haalt een lijst met opslagplaatsen voor een bepaalde gebruiker op die als padparameter zijn doorgegeven.

De listRepoContributers () methode haalt een lijst met bijdragers op voor een bepaalde gebruiker en repository, beide doorgegeven als padparameters.

2.3. Logica

Laten we de vereiste logica implementeren met behulp van Retrofit Bel objecten en normale Java-code:

klasse GitHubBasicService {privé GitHubBasicApi gitHubApi; GitHubBasicService () {Retrofit retrofit = nieuwe Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .build (); gitHubApi = retrofit.create (GitHubBasicApi.class); } List getTopContributors (String userName) genereert IOException {List repos = gitHubApi .listRepos (userName) .execute () .body (); repos = repos! = null? repos: Collections.emptyList (); retourneer repos.stream () .flatMap (repo -> getContributors (gebruikersnaam, opslagplaats)) .sorted ((a, b) -> b.getContributions () - a.getContributions ()) .map (Bijdrager :: getName). distinct () .sorted () .collect (Collectors.toList ()); } private Stream getContributors (String userName, Repository repo) {List contributors = null; probeer {contributors = gitHubApi .listRepoContributors (gebruikersnaam, repo.getName ()) .execute () .body (); } catch (IOException e) {e.printStackTrace (); } contributors = contributors! = null? bijdragers: Collections.emptyList (); return contributors.stream () .filter (c -> c.getContributions ()> 100); }}

3. Integreren met RxJava

Retrofit stelt ons in staat om de resultaten van oproepen te ontvangen met aangepaste handlers in plaats van de normale Bel object met behulp van Retrofit Bel adapters. Dit maakt het mogelijk om RxJava te gebruiken Waarneembare en Flowables hier.

3.1. Afhankelijkheden van Maven

Om de RxJava-adapter te gebruiken, moeten we dit Maven-artefact opnemen:

 com.squareup.retrofit2 adapter-rxjava 2.3.0 

Controleer voor de laatste versie adapter-rxjava in de centrale opslagplaats van Maven.

3.2. Registreer RxJava Call Adapter

Laten we toevoegen RxJavaCallAdapter aan de bouwer:

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

3.3. API-interface

Op dit punt kunnen we het retourtype van de te gebruiken interfacemethoden wijzigen Waarneembaar liever dan Bel. We kunnen andere Rx-typen gebruiken, zoals Waarneembaar, Vloeiend, Single, Kan zijn, Voltooibaar.

Laten we onze API-interface aanpassen om te gebruiken Waarneembaar:

openbare interface GitHubRxApi {@GET ("users / {user} / repos") Waarneembaar listRepos (@Path ("user") String-gebruiker); @GET ("repos / {user} / {repo} / contributors") Waarneembaar listRepoContributors (@Path ("gebruiker") String gebruiker, @Path ("repo") String repo); }

3.4. Logica

Laten we het implementeren met RxJava:

klasse GitHubRxService {privé GitHubRxApi gitHubApi; GitHubRxService () {Retrofit retrofit = nieuwe Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .addCallAdapterFactory (RxJavaCallAdapterFactory.create ()). gitHubApi = retrofit.create (GitHubRxApi.class); } Waarneembare getTopContributors (String gebruikersnaam) {retourneer gitHubApi.listRepos (gebruikersnaam) .flatMapIterable (x -> x) .flatMap (repo -> gitHubApi.listRepoContributors (gebruikersnaam, repo.getName ())) .flatMapIterable (x -> x) .filter (c -> c.getContributions ()> 100) .sorted ((a, b) -> b.getContributions () - a.getContributions ()) .map (Bijdrager :: getName) .distinct (); }}

4. Conclusie

Door de code voor en na het gebruik van RxJava te vergelijken, hebben we ontdekt dat deze op de volgende manieren is verbeterd:

  • Reactief - aangezien onze gegevens nu in stromen stromen, stelt het ons in staat om asynchrone stroomverwerking uit te voeren met niet-blokkerende tegendruk
  • Duidelijk - vanwege het declaratieve karakter
  • Beknopt - de hele operatie kan worden weergegeven als één operatieketen

Alle code in dit artikel is beschikbaar op GitHub.

Het pakket com.baeldung.retrofit.basic bevat het standaard retrofit-voorbeeld terwijl het pakket com.baeldung.retrofit.rx bevat het retrofit-voorbeeld met RxJava-integratie.


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