【问题标题】:retrofit2 rxjava 2 - how can access to body of response when have errorretrofit2 rxjava 2 - 出现错误时如何访问响应体
【发布时间】:2020-01-28 20:39:35
【问题描述】:

我将 Retrofit 与 Rxjava 一起用于对服务器的请求。
我的服务器返回定义的包含数据的 json 格式和定义的消息。
服务器返回http响应。如果服务器返回成功码(200)就可以了。
但我想,如果服务器返回其他代码,我会管理该响应的正文。
例如:
服务器返回 401,我想读取服务器显示消息的响应正文。
但是当服务器其他代码时,改造调用 onError 方法,我不能使用响应体。
如何解决这个问题?
这是我的方法

'''

private void login(String username , String password){
    view.setLoading();
    source.loginUser(username, password)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new SingleObserver<Response<LoginResult>>() {
                @Override
                public void onSubscribe(Disposable d) {
                    disposable.add(d);
                }

                @Override
                public void onSuccess(Response<LoginResult> loginResult) {

                    if (loginResult.isSuccessful()){


                        }
                        else
         new AlertConfiguration(view.getViewActivity()).showMessage(loginResult.body().getMessage());

                    }



                @Override
                public void onError(Throwable e) {

           if there is a problem          
                }
            });

'''
这是我改造的接口方法

@POST("...")
Single<Response<LoginResult>> loginUser(@Query("username") String username, @Query("password") String password);

【问题讨论】:

  • 你能分享两种情况下的响应吗(成功,失败)?我认为 API 返回不同的 json 对象。

标签: android android-studio observable retrofit2 rx-java2


【解决方案1】:

根据here 的信息,由于您已经在使用Response&lt;LoginResult&gt;,您应该能够将 Throwable 转换为 HttpException,然后提取响应的正文。

在 Kotlin 中:

if (e is HttpException) {
    val errorBody = (e as HttpException).response().errorBody()
}

在 Java 中:

 if (e instanceof HttpException) {
     HttpException error = (HttpException)e;
     String errorBody = error.response().errorBody().string();
 }

使用您的 Java 代码的完整示例:

import retrofit2.HttpException

private void login(String username , String password){
    view.setLoading();
    source.loginUser(username, password)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new SingleObserver<Response<LoginResult>>() {
                @Override
                public void onSubscribe(Disposable d) {
                    disposable.add(d);
                }

                @Override
                public void onSuccess(Response<LoginResult> loginResult) {
                    if (loginResult.isSuccessful()){
                      // Handle success

                    } else {
                      // Handle login failure
                       new AlertConfiguration(view.getViewActivity()).showMessage(loginResult.body().getMessage());
                    }

                }

                @Override
                public void onError(Throwable e) {
                  // Get the error response:
                  if (e instanceof HttpException) {
                    HttpException error = (HttpException)e;
                    String errorBody = error.response().errorBody().string();
                    // Then parse the errorBody and extract the values you need
                  }
                }
            });

【讨论】:

  • 由于onError也可能是由调用内部的其他异常引起的,我会避免强制转换并首先通过if (e instanceof HttpException)检查然后再转换它
【解决方案2】:

我找到解决方案
在响应代码为 200 的改造 onSuccess 方法中,您应该从 body 对象获得响应。
但是当不是 200 时,你应该得到 errorBody 的响应;

new Gson().fromJson(serverResultResponse.errorBody().string(), ServerResult.class);

【讨论】:

    猜你喜欢
    • 2017-03-22
    • 2017-01-20
    • 2018-03-05
    • 2021-02-18
    • 1970-01-01
    • 2020-04-05
    • 2018-05-26
    • 2017-04-24
    • 1970-01-01
    相关资源
    最近更新 更多