2017-10-16 17 views
0

ログインページを持つプロジェクトがあります。このページでは、ユーザーが「サインイン」をクリックした後、checkUserNameにリクエストを送信して(そのユーザーがログインしているかどうかを確認して)、次に認証する必要があります。rxjavaでauthの2つのリクエストを処理する

インタフェース:

@POST("endpoint") 
Flowable<AccountResponse> auth(@Body AuthRequestBody authRequestBody); 

@POST("endpoint") 
Flowable<CheckUsernameResponse> checkUserName(@Body CheckUserNameRequest checkUserNameRequest); 

RestService:

public Flowable<AccountResponse> auth(String login, String password) { 
    return api.auth(new AuthRequestBody(login, password)).compose(handleError()); 
} 

public Flowable<CheckUsernameResponse> checkUserName(String login) { 
    return api.checkUserName(new CheckUserNameRequest(login)).compose(handleError()); 
} 

とRx:私はRxの中で確認することができますどのように

public Flowable<AccountResponse> auth(String login, String password) { 
    return checkUsername(login).flatMap(checkUsernameResponse -> restService.auth(login, password)) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnNext(loginResponse -> { 
       tokenManager.saveToken(loginResponse.getToken()); 
      }); 
} 

public Flowable<CheckUsernameResponse> checkUsername(String login) { 
    return restService.checkUserName(login) 
      .subscribeOn(Schedulers.io()); 
} 

、私はこれを持っているコードで

最初のクエリがOKならば? (checkUsername)。つまり、そのAPIはエラーmsgを返さなかったし、UserIdはOKであり、isAccessGrantedはtrueであり、次に2回目の要求をauthに送信するだけですか?

答えて

0

flatMapの中には、新しいFlowableを返すか、エラーを出す前に自由にチェック/検証を行うことができます。スケジューラの考慮事項を簡潔に省略すると、次のようになります。

public Flowable<AccountResponse> auth(String login, String password) { 
     return checkUsername(login) 
      .flatMap(checkUsernameResponse -> { 
       // do whatever checking you want to do here, e.g.: 
       if (!checkUsernameResponse.isUsernameOk()) { 
        throw new RuntimeException("Access not granted.")); 
       } 
       // First call succeeded, proceed to the second one: 
       return restService.auth(login, password); 
      }) 
      .doOnNext(loginResponse -> { 
       tokenManager.saveToken(loginResponse.getToken()); 
      }); 
     } 
関連する問題