【问题标题】:Retrofit response codes with RxJava2使用 RxJava2 改造响应代码
【发布时间】:2018-06-20 10:11:07
【问题描述】:

所以我想实现这个视频中的 API 响应示例 droidcon NYC 2017 - Advanced Networking with RxJava + Retrofit

这是我的代码:

Presenter.java

compositeDisposable.add(RetrofitClient.createService(GetApi.class)
            .getResponseFromServer(token)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<ResponseFromServer>() {
                @Override
                public void accept(ResponseFromServer responseFromServer) throws Exception {
                    mView.setResponseObject(responseFromServer);
                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(Throwable throwable) throws Exception {
                    throwable.printStackTrace();
                    if (throwable instanceof HttpException) {
                        int responseCode = ((HttpException) throwable).code();
                    }

                }
            }));

所以在这里,当我从服务器收到一些 4xx 错误响应时,我可以转到 Throwable 并获取响应代码,如果响应正常,我可以获取我的对象,一切都很好。

但是,在上面的视频示例中,该人建议我将 ResponseFromServer 包装成这样的响应: Single&lt;Response&lt;ResponseFromServer&gt;&gt; getResponseFromServer(@Header("X-Authorize") String token); 所以我也可以访问响应代码,但在这种情况下,我的 Throwable 永远不会被调用,所以我只能在第一个接受方法中访问代码,但在视频中他发现了​​ @987654327 中的错误@ 部分。所以,我无法弄清楚我做错了什么?也许我使用了错误的观察者?

【问题讨论】:

    标签: android retrofit2 rx-java2 android-networking


    【解决方案1】:

    我想我明白了,如果我们用Observable&lt;Response&lt;Object&gt;&gt; 包装我们的响应对象,所有响应代码都会被常规的接受方法捕获,所以我们需要手动提取代码并进行检查。但是,如果我们保留Observable&lt;Object&gt;,errorCode 400 将在 onError 方法中被捕获。

    【讨论】:

    • 这就是我提到的@RadoVidjen
    • @MilindMevada 是的,您提到了重要的错误代码部分,但 RadoVidjen 的回答对此进行了扩展,告诉我们包装我们的响应以便能够使用 Observable> 进行解析(但是,我正在使用 Single 我认为它在 2020 年会做同样的事情)
    【解决方案2】:

    当来自服务器的响应为 code &lt; 200 || code &gt;= 300 时,将调用 onError()。和其他情况 onNext() 将调用。

    另外,如果您来自 onNext() 的代码抛出任何异常,那将在 onError() 中被捕获

    【讨论】:

    • 感谢您的回答。但不幸的是,当我有这种形式的观察者Single&lt;Response&lt;ResponseFromServer&gt;&gt; 时,404 错误在第一次接受中被捕获,而不是在 onError 中,这就是主要问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2021-07-11
    • 2018-02-09
    • 1970-01-01
    相关资源
    最近更新 更多