我正试图升级到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对2.0进行 retrofit ?

推荐答案

而不是像您那样声明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

EDIT:好的,我终于抽出时间研究了e-Nouri在他们的 comments 中说的话,也就是说只有2xx代码会变成onNext.事实证明我们都是对的:

如果调用是这样声明的:

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

甚至这个

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

all响应将以onNext结尾,无论它们的错误代码是什么.这是可能的,因为所有的东西都被Retrofit包装在一个Response对象中.

另一方面,如果调用是这样声明的:

Observable<MyResponseObject> apiCall(@Body body);

还是这个

Observable<ResponseBody> apiCall(@Body body);

事实上,只有2xx的响应才会达到onNext.其他所有东西都将被包装在HttpException中并发送到onError.这也是有道理的,因为如果没有Response包装器,shouldonNext会发出什么信号?考虑到请求没有成功,唯一明智的做法是emits null...

Android相关问答推荐

Google Play测试应用程序Crash-java.lang.NoSuchFieldError:没有Lkotlinx/coroutines/CoroutineExceptionHandler类型的字段键

如何使可拖动内容停留在可组合框的边界内

Android-LVL库始终返回NOT_SUBLISTED

为什么Kotlin允许将非空值类型化为可空类型,但又将其视为非空值?

看不到选项菜单栏

如何使用react native下载android中/data/data/[应用程序包名称文件夹]/files中的文件

Gradle在我的Android Compose项目中继续推广依赖版本

块不起作用,出现 "只有安全的 (?.)... " 错误

使用 Kotlin 在 Android 中导航时如何防止 ViewModel 被杀死?

未找到 com.android.tools.build:gradle:7.4.0 的匹配变体

Visual Studio 无法在 Android 上编译 .NET MAUI 项目

在 Compose 中停止键盘将顶部应用栏推离屏幕

Android工作室未成立

如何在 BottomBar jetpack compose 中删除选定的椭圆项目 colored颜色

Jetpack Compose TextField 在输入新字符时不更新

如何在 Jetpack compose 中将 Canvas 中的文本居中?

设备文件资源管理器-ROOM 数据库中的数据库文件夹为空

Android Studio (Kotlin):无法启动活动

AndroidX Room 生成类错误:类是公共的,应在名为 class.java 的文件中声明

单个用户可以在 Firebase 身份验证中将多个电话号码链接到他的帐户吗?