使用 rxjava 处理两个身份验证请求



我有一个带有登录页面的项目。在此页面上,用户单击"登录"后,我需要向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());
            });
        }

最新更新