首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在RxJava2中处理400响应

如何在RxJava2中处理400响应
EN

Stack Overflow用户
提问于 2018-04-11 18:12:55
回答 2查看 568关注 0票数 0

我正在努力解决RxJava2中正确的异常处理问题。我正在尝试刷新OkHttp3拦截器中的令牌,如下所示:

代码语言:javascript
复制
tokenRepository.refreshToken(authStateManager.current.refreshToken!!)
                        .doOnError {
                            Log.w(TAG, "Could not obtain new access token.")

                            authStateManager.signOut()
                        }
                        .subscribe { tokenResponse ->
                            Log.d(TAG, "Obtained new access token: " + tokenResponse.toString())

                            authStateManager.updateAfterTokenResponse(TokenResponse.jsonDeserialize(tokenResponse.toString()), null)

                            token = authStateManager.current.accessToken
                        }

如果刷新令牌有效,并且请求返回200,则可以很好地工作。但是,如果刷新令牌无效,并且我得到一些错误代码(例如400),则会执行doOnError块,但随后它会继续执行subscribe块,其中会抛出以下异常:

代码语言:javascript
复制
retrofit2.adapter.rxjava2.HttpException: HTTP 400 
        at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:54)
        at retrofit2.adapter.rxjava2.BodyObservable$BodyObserver.onNext(BodyObservable.java:37)
...

我尝试使用onErrorReturnonErrorResumeNext,但我想完全跳过订阅块(如果出现错误,只需注销用户,不尝试执行任何操作)。有可能吗?refreshToken方法返回Single<JsonObject>类型的响应。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-11 18:16:58

你不能在订阅中使用onError吗?我喜欢使用RxKotlin来做这件事。例如,我可以执行以下操作:

代码语言:javascript
复制
.subscribeBy(onSuccess = {
     // do Something in on success
}, onError = {
     // do something in onError
})

因此,在您的情况下,可能是这样的:

代码语言:javascript
复制
tokenRepository.refreshToken(authStateManager.current.refreshToken!!)
    .subscribeBy(onSuccess = {
        Log.d(TAG, "Obtained new access token: " + it.toString())
        authStateManager.updateAfterTokenResponse(TokenResponse.jsonDeserialize(it.toString()), null)
        token = authStateManager.current.accessToken
    }, onError = {
        Log.w(TAG, "Could not obtain new access token.")
        // the variable "it" here is a throwable which means you can determine if it's a RetrofitException and what status code is returned
    })

但是,如果您不想使用RxKotlin,您可以在Kotlin中像这样处理Rx订阅:

代码语言:javascript
复制
.subscribe({ Log.d(TAG, "Obtained new access token: " + it.toString()) },
           { Log.e(TAG, "Error is ${it.message}") })

您可以在使用Log.e的函数的第二部分中处理错误。

票数 3
EN

Stack Overflow用户

发布于 2018-04-12 19:09:04

我刚刚遇到了同样的问题,但我现在解决了它。我不知道我的解释是否正确,但似乎doOnError没有处理这个异常。

您需要使用接受onError Consumer作为参数的subscribe()方法,并处理那里的错误:

代码语言:javascript
复制
subscribe(Consumer<? super T> onSuccess, Consumer<? super Throwable> onError)

在Java中,它看起来像这样:

代码语言:javascript
复制
.subscribe(tokenResponse -> {
                Log.d(TAG, "Obtained new access token: " + tokenResponse.toString());
                authStateManager.updateAfterTokenResponse(TokenResponse.jsonDeserialize(tokenResponse.toString()), null);
                token = authStateManager.current.accessToken;
            }, throwable -> {
                Log.w(TAG, "Could not obtain new access token.");
                authStateManager.signOut();
            }));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49772343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档