2017-02-02 26 views
3

У меня есть сервис модифицированного, содержащего следующий интерфейсВыполнения последовательных вызовов API с Модернизированный и возвращение наблюдаемой

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); 
} 

Я хотел бы определить метод, чтобы сделать вызов апи, чтобы получить счет, который содержит USERID, а затем используйте этот идентификатор, чтобы сделать второй вызов API, чтобы получить статус подписки на пользователей. SubscriptionStatus содержит логическое значение, и если оно истинно, мне бы хотелось, чтобы метод возвращал Observable.

Это, как я пошел об этом до сих пор:

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 
} 

ответ

6

Как насчет

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 
    ); 

В случае, если вам нужно как счет и статус, последнюю карту() должен возвращать некоторые composite type из двух:

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

Спасибо, что это сработало. Знаете ли вы, как я могу обрабатывать и возвращать ошибки для каждого вызова API ? –