2017-10-16 39 views
0

我有一个包含登录页面的项目。在这个页面上,用户点击“登录”后,我需要发送请求到checkUserName(检查我们是否有这样的用户,他可以登录),然后才能进行身份验证。使用rxjava处理两个身份验证请求

在代码中,我有这样的:

接口:

@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:

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

我怎么能处于RX检查,如果第一个查询是可以的? (checkUsername)。我的意思是,该API没有返回错误消息,UserId是好的,isAccessGranted是真实的,然后才发送第二个请求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()); 
      }); 
     }