我有一个带有登录页面的项目。在此页面上,用户单击"登录"后,我需要向checkUserName发送请求(检查我们是否有这样的用户并且他可以登录),然后才进行身份验证。
在代码中,我有这个:
接口:
@POST("endpoint")
Flowable<AccountResponse> auth(@Body AuthRequestBody authRequestBody);
@POST("endpoint")
Flowable<CheckUsernameResponse> checkUserName(@Body CheckUserNameRequest checkUserNameRequest);
休息服务:
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?(检查用户名)。我的意思是,该 API 没有返回错误消息,UserId 正常,并且 isAccessGrant 为真,然后才向身份验证发送第二个请求?
在 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());
});
}