使用Retrofit 2.0和RxJava获取响应状态代码

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我正在尝试升级到Retrofit 2.0并在我的Android项目中添加RxJava。我正在进行api调用,并希望在服务器发生错误响应的情况下检索错误代码。

Observable<MyResponseObject> apiCall(@Body body);

在RxJava调用中:

myRetrofitObject.apiCall(body).subscribe(new Subscriber<MyResponseObject>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(MyResponseObject myResponseObject) {
           //On response from server
        }
    });

在Retrofit 1.9中,RetrofitError仍然存在,我们可以通过以下方式获得状态:

error.getResponse().getStatus()

如何使用RxJava进行Retrofit 2.0操作?

提问于
用户回答回答于

不像你所做的那样声明API调用:

Observable<MyResponseObject> apiCall(@Body body);

你也可以像这样声明它:

Observable<Response<MyResponseObject>> apiCall(@Body body);

然后您将拥有如下的订阅者:

new Subscriber<Response<StartupResponse>>() {
    @Override
    public void onCompleted() {}

    @Override
    public void onError(Throwable e) {
        Timber.e(e, "onError: %", e.toString());

        // network errors, e. g. UnknownHostException, will end up here
    }

    @Override
    public void onNext(Response<StartupResponse> startupResponseResponse) {
        Timber.d("onNext: %s", startupResponseResponse.code());

        // HTTP errors, e. g. 404, will end up here!
    }
}

因此,具有错误代码的服务器响应也将被传递给onNext您,并且您可以通过调用获取代码reponse.code()

http://square.github.io/retrofit/2.x/retrofit/retrofit/Response.html

好的,我终于看到了电子努里在他们的评论中说,即只有2xx代码将要onNext。原来我们都是对的:

如果通话声明如下:

Observable<Response<MyResponseObject>> apiCall(@Body body);

甚至是这个

Observable<Response<ResponseBody>> apiCall(@Body body);

onNext无论错误代码如何,所有响应都将以最终结果为准。这是可能的,因为所有东西都是Response通过Retrofit 包装在一个对象中的。

另一方面,如果通话声明如下:

Observable<MyResponseObject> apiCall(@Body body);

或这个

Observable<ResponseBody> apiCall(@Body body);

事实上只有2xx的回应将会出现onNext。其他一切将被包裹在一个HttpException并发送到onError。这也是有道理的,因为没有Response包装,应该发射onNext什么?鉴于请求不成功,唯一明智的事情将是null......

用户回答回答于

在onError方法里面放到这个代码中

((HttpException) e).code()

扫码关注云+社区