【问题标题】:Working with two requests for auth with rxjava使用 rxjava 处理两个身份验证请求
【发布时间】:2018-03-27 13:26:22
【问题描述】:

我有一个带有登录页面的项目。在这个页面上,用户点击“登录”后,我需要向 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 没问题, isAccessGranted 是真的,然后才向身份验证发送第二个请求?

【问题讨论】:

    标签: android retrofit rx-java2


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多