2017-02-02 3 views
3

J'ai un service de mise à niveau qui contient l'interface suivanteFaire des appels api successifs avec amélioration et retour observables

public interface ApiService { 

    @GET("https://stackoverflow.com/users/me") 
    Observable<Account> authenticateUser(@Header("Authorization") String auth); 

    @GET("/membership/{userId}") 
    SubscriptionStatus getSubscriptionStatus(@Path("userId") String userId); 
} 

Je voudrais définir une méthode pour faire un appel api pour obtenir le compte qui contient le userId, puis utilisez cet ID pour effectuer un second appel d'API pour obtenir le statut d'abonnement des utilisateurs. SubscriptionStatus contient un booléen et si c'est vrai je voudrais que la méthode renvoie Observable.

Voilà comment je suis allé à ce sujet jusqu'à présent:

public Observable<Account> doLogin(ApiService service , String credentials) { 

return service.authenticateuser(base64) // gets Account observable 
     .doOnNext(account -> { 
      currentAccount = account; // setting the Account Variable 
     }) 
     .flatMap(account -> service.getSubscriptionStatus(account.getUserId())) // get Account Subscription status 

     ... //unsure where to go from here I need to check 
      //the subscriptionStatus object and return account   
      //observable if condition is valid 
} 

Répondre

6

Que diriez-vous

return service.authenticateuser(base64) // gets Account observable 
    .doOnNext(account -> { 
     currentAccount = account; // setting the Account Variable 
    }) 
    .flatMap(account -> 
     service.getSubscriptionStatus(account.getUserId()) 
     .filter(status -> status.isActive()) // don't let status pass if not active 
     .map(status -> account) // we actually need the original account 
    ); 

Si vous avez besoin à la fois le compte et l'état, la dernière carte() devrait renvoyer certains composite type des deux:

.map(status -> new Pair<>(account, status)) 
+0

Merci beaucoup cela a fonctionné, savez-vous comment je peux gérer et renvoyer des erreurs pour chaque appel API ? –