Выполнение последовательных вызовов API с помощью Retrofit и возвращение наблюдаемого

У меня есть служба модернизации, которая содержит следующий интерфейс

public interface ApiService {

    @GET("/users/me")
    Observable<Account> authenticateUser(@Header("Authorization") String auth);

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

Я хотел бы определить метод для вызова API для получения учетной записи, которая содержит идентификатор пользователя, а затем использовать этот идентификатор для выполнения второго вызова 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
}

person Dipo Areoye    schedule 02.02.2017    source источник


Ответы (1)


Как насчет

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

Если вам нужна и учетная запись, и статус, последняя карта() должна возвращать несколько составной тип из двух:

 .map(status -> new Pair<>(account, status))
person akarnokd    schedule 02.02.2017
comment
Большое спасибо, это сработало. Знаете ли вы, как я могу обрабатывать и возвращать ошибки для каждого вызова API? - person Dipo Areoye; 03.02.2017