שילוב רטרופיט עם RxJava

1. סקירה כללית

מאמר זה מתמקד כיצד ליישם לקוח REST פשוט מוכן ל- RxJava באמצעות Retrofit.

נבנה יישום לדוגמא המתקשר עם ממשק ה- API של GitHub - תוך שימוש בגישת ה- Retrofit הרגילה, ואז נשפר אותה באמצעות RxJava כדי למנף את היתרונות של תכנות תגובתי.

2. שיפוץ רגיל

בואו קודם בונים דוגמה עם Retrofit. נשתמש בממשקי ה- API של GitHub כדי לקבל רשימה ממוינת של כל התורמים שיש להם יותר מ -100 תרומות בכל מאגר.

2.1. תלות Maven

כדי להתחיל פרויקט עם Retrofit, בואו נכלול את הממצאים הבאים של Maven:

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

לגרסאות העדכניות, עיין במאגר רטרופיט וממיר gson במאגר Maven Central.

2.2. ממשק API

בואו ניצור ממשק פשוט:

ממשק ציבורי GitHubBasicApi {@GET ("משתמשים / {user} / repos") רשימת שיחות Repos (@Path ("משתמש") משתמש מחרוזת); @GET ("repos / {user} / {repo} / contributors") Call listRepoContributors (@Path ("user") User String, @Path ("repo") Repo String); }

ה listRepos () שיטה מאחזרת רשימת מאגרים עבור משתמש נתון שהועברה כפרמטר נתיב.

ה listRepoContributors () השיטה מאחזרת רשימת תורמים עבור משתמש ומאגר נתון, שניהם מועברים כפרמטרים של נתיב.

2.3. הִגָיוֹן

בואו לממש את ההיגיון הנדרש באמצעות Retrofit שִׂיחָה אובייקטים וקוד Java רגיל:

מחלקה GitHubBasicService {פרטי GitHubBasicApi gitHubApi; GitHubBasicService () {Retrofit retrofit = new Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .build (); gitHubApi = retrofit.create (GitHubBasicApi.class); } רשימת getTopContributors (מחרוזת שם משתמש) זורקת IOException {List repos = gitHubApi .listRepos (userName) .execute () .body (); repos = repos! = null? repos: Collections.emptyList (); להחזיר repos.stream () .flatMap (repo -> getContributors (userName, repo)) .sorted ((a, b) -> b.getContributions () - a.getContributions ()) .map (Contributor :: getName). נבדל () .sorted () .collect (Collectors.toList ()); } זרם פרטי getContributors (מחרוזת userName, repo מאגר) {רשימה תורמים = null; נסה {contributors = gitHubApi .listRepoContributors (userName, repo.getName ()) .execute () .body (); } לתפוס (IOException e) {e.printStackTrace (); } תורמים = תורמים! = null? תורמים: Collections.emptyList (); return contributors.stream () .filter (c -> c.getContributions ()> 100); }}

3. שילוב עם RxJava

רטרופיט מאפשר לנו לקבל תוצאות שיחות עם מטפלים בהתאמה אישית במקום הרגיל שִׂיחָה התנגד באמצעות Retrofit שִׂיחָה מתאמים. זה מאפשר להשתמש ב- RxJava נצפים ו זרימות פה.

3.1. תלות Maven

כדי להשתמש במתאם RxJava, עלינו לכלול חפץ Maven זה:

 com.squareup.retrofit2 מתאם-rxjava 2.3.0 

לקבלת הגרסה האחרונה, אנא בדוק את adapter-rxjava במאגר המרכזי של Maven.

3.2. רשום את מתאם השיחות של RxJava

בואו נוסיף RxJavaCallAdapter לבנאי:

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

3.3. ממשק API

בשלב זה אנו יכולים לשנות את סוג ההחזרה של שיטות הממשק לשימוש נצפה ולא שִׂיחָה. אנו עשויים להשתמש בסוגי Rx אחרים כמו נצפה, זורם, יחיד, אולי, הושלם.

בואו ונשתנה את ממשק ה- API שלנו לשימוש נצפה:

ממשק ציבורי GitHubRxApi {@GET ("משתמשים / {user} / repos") נצפה listRepos (@Path ("משתמש") משתמש מחרוזת); @GET ("repos / {user} / {repo} / contributors") נצפה listRepoContributors (@Path ("user") משתמש מחרוזת, @Path ("repo") repo מחרוזת); }

3.4. הִגָיוֹן

בואו ליישם את זה באמצעות RxJava:

מחלקה GitHubRxService {פרטי GitHubRxApi gitHubApi; GitHubRxService () {Retrofit retrofit = new Retrofit.Builder () .baseUrl ("// api.github.com/") .addConverterFactory (GsonConverterFactory.create ()) .addCallAdapterFactory (RxJavaCallAdapterFactory.create ()) .build ();. gitHubApi = retrofit.create (GitHubRxApi.class); } נצפה getTopContributors (מחרוזת משתמש שם) {להחזיר 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. מסקנה

השוואת הקוד לפני ואחרי השימוש ב- RxJava, גילינו שהוא שופר בדרכים הבאות:

  • תגובתי - מכיוון שהנתונים שלנו זורמים כעת בזרמים, זה מאפשר לנו לבצע עיבוד זרם אסינכרוני עם לחץ אחורי לא חוסם
  • ברור - בשל אופיו ההצהרתי
  • תמציתי - ניתן לייצג את כל הפעולה כשרשרת פעולה אחת

כל הקוד במאמר זה זמין באתר GitHub.

החבילה com.baeldung.retrofit.basic מכיל את הדוגמה הבסיסית למילוי חוזר בזמן החבילה com.baeldung.retrofit.rx מכיל את דוגמת החידוש עם שילוב RxJava.


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