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

2024-01-06

我正在尝试升级到 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 http://square.github.io/retrofit/2.x/retrofit/retrofit/Response.html

EDIT:好的,我终于开始研究 e-nouri 在他们的评论中所说的内容,即只有 2xx 代码才能onNext。事实证明我们都是对的:

如果调用是这样声明的:

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

甚至这个

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

all回应将最终在onNext,无论其错误代码如何。这是可能的,因为一切都包裹在Response改造对象。

另一方面,如果调用声明如下:

Observable<MyResponseObject> apiCall(@Body body);

or this

Observable<ResponseBody> apiCall(@Body body);

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Retrofit 2.0和RxJava获取响应状态代码 的相关文章

  • Cordova 插件包括 Android 库 (Gradle)

    我想包括这个 Androidlibrary https github com 50ButtonsEach fliclib android在 Cordova 插件中 该库本身由 Gradle 管理 如 Github 链接所示 图书馆的开发者只
  • Flutter - 每次应用程序重新启动后保留变量的值

    在我的一页上 我希望我的用户从一个变量上的默认文本开始 codeDialog 然后我希望他们更改该文本 之后他们编写的文本将成为我的新默认文本 遗憾的是我无法让它发挥作用 现在 当我重新启动应用程序并打开该屏幕时 它会重置为null 我认为
  • android widget 和 localservice 绑定

    我编写播放器 它的主要活动是运行本地服务 我找不到如何将本地服务绑定到小部件 当我尝试像在活动中一样绑定它时 它失败了 请帮助我 添加 1 何时可以联系后台服务 http www developer com ws data article
  • 更改 Android Spinner 布局/设计

    我正在尝试修改设计Spinner http developer android com intl de reference android widget Spinner html小部件 我可以更改背景 但找不到更改右侧箭头图标的方法 有办法
  • 如何通过 Android 中的 Google Fit 集成获取用户信息

    我正在将 Google Fit 应用程序集成到 Android 应用程序中 以使用 SENSORS API 和 HISTORY API 跟踪健身数据 获取步数 如何使用该 API 获取用户信息 电子邮件或用户 ID 对你来说完美的例子 这可
  • 我该怎么办:这需要 android.permission.INTERACT_ACROSS_USERS_FULL

    我正在致力于将 micode 的开源指南针集成到我正在制作的应用程序中 我想知道当我在清单中以正确的拼写清楚地说明了此权限错误时 如何修复此权限错误 我仍然需要该许可 这让我很困惑 11 03 13 53 58 241 E AndroidR
  • Android TableRow 垂直拉伸以填充屏幕

    我正在尝试创建一个电话拨号器视图 使用 TableLayout 在 3x4 网格中创建 12 个按钮 我希望行垂直拉伸以平等地使用所有可用空间 但似乎 fill parent 在 TableRows 上不起作用 我不想使用 setMinim
  • FragmentTransaction 动画滑入顶部

    我试图使用 FragmentTransaction setCustomAnimations 实现以下效果 片段A正在显示 将片段 A 替换为片段 B 片段 A 在替换过程中应保持可见 片段 B 应从右侧滑入 片段 B 应滑入片段 A 的顶部
  • firestore快照监听器生命周期和定价之间有什么关系?

    在我的活动中 我有一个字符串列表 这些字符串表示我想要附加快照侦听器的 Firestore 文档 我使用 Acivity ModelView 存储库结构 在活动的 onCreate 中 我向 ViewModelProvider 询问适当的
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • Android Mockito.verify 说参数不同!打印相同内容

    情况 我有一个界面Tracker其中有这个方法 fun trackEvent event String args Bundle null 我想验证是否使用特定的调用此方法event 被测试的内部对象调用此方法Bundle目的 所有事件都指定
  • CollapsingToolbarLayout 禁用绘制扩展

    我有一个已有条件禁用的 CollapsingToolbar 当用户在这种情况下加载视图时 它看起来就像一个普通的 ToolBar 对象 唯一奇怪的是 如果它们向下拖动 例如在拉动刷新样式操作中 折叠工具栏就会展开 尽管我的愿望和代码与此相反
  • 发送 OneSignal 推送通知时 Android 应用程序崩溃

    Android 应用程序在发送信号推送通知后立即崩溃 我收到这个错误 尝试查看其他 stackoverflow 答案 但没有帮助 请检查下面的代码 build gradle 和错误 不明白为什么它不起作用 P 请检查下面的代码 build
  • 颤动附近的连接

    当我尝试在设备上做广告或发现时 我收到此错误 但是前一天在环路上效果很好 PlatformException Failure 17 API Nearby CONNECTIONS API is not available on this de
  • Android - 从服务器获取响应时验证 JSON 以避免 JSONException

    在我的一些与服务器通信并使用 http 获取响应的应用程序中 我使用 json 来格式化数据服务器端 当它到达设备时 我使用类似于我在 stackoverflow 上找到的代码 private class LoadData extends
  • 在 Android 版 Glide 中离线时加载已获取的图像

    我正在使用 Glide 版本 4 8 0 为了加载图像我这样做 GlideApp with HomePageFragment this load remoteURL diskCacheStrategy DiskCacheStrategy A
  • 使用 IntelliJ / Android Studio 调试基于 gradle 的单元测试

    我正在使用robolectric gradle 插件 https github com robolectric robolectric gradle plugin为 Android 编写单元测试 到目前为止 除了能够使用 Android S
  • 有没有办法模拟小部件或屏幕特定位置的触摸?

    我想触摸或点击小部件上的某处 而不让用户在此时明确触摸屏幕 有什么办法可以做到吗 我已经检查了SO答案 有些人建议使用 集成测试 但在未物理或以某种方式连接到笔记本电脑的设备上无法执行 集成测试 无法找到更好的措辞 我还尝试进行 hitTe
  • Android 在通话期间播放音频文件[重复]

    这个问题在这里已经有答案了 对于我的 Android 应用程序 我想在从应用程序接听电话后播放音频文件 应用程序将发起电话呼叫 一旦接收者接听电话 应用程序应开始播放录制的音频文件 通过在谷歌上进行大量搜索 我发现这对于未root的设备来说
  • Phonegap - cordova 在 Android 和 iOS 设备上延迟且缓慢

    我刚刚开始使用 zend studio 开始我的第一个 PhoneGap 项目 但是 在我构建并部署它之后 该应用程序非常慢 Android 和 iOS 均可 滚动滞后 如果我按下按钮 转到下一页的速度很慢 有什么办法可以提高它的性能吗 提

随机推荐

  • 如何限制用户在输入元素中输入10位数字?

    我想为电话号码创建一个输入字段 我正在使用 JavaScript 动态创建输入字段
  • 带对齐的字符串格式货币

    print this is 0 gt 10 2f format 3 44 打印出 this is 3 44 即分开 从金额 有没有办法在金额旁边的正确位置打印带有货币符号的间隔列 例如 this is 3 44 I tried print
  • MongoDB:使用 2 个嵌套数组更新文档中的平均值

    我有以下 MongoDB 文档 id ObjectId company name Name registered 2 21 2015 2 00 trucks truck id TEB7622 weight 88 33 capacity 27
  • CamelCase JSON WebAPI 子对象(嵌套对象、子对象)

    我正在创建一个复杂的对象 其中包含要从我的 Web api 控制器返回的子对象 嵌套对象 该对象包含其他对象类型的列表 列表中的这些子对象类型遵循 NET 中使用的 pascal 大小写 var persons peopleLookup V
  • 如何最好地将模糊的 ProgressBar 放置在屏幕上的 ConstraintLayout 上?

    当我单击 登录 按钮时 会显示一个进度条 我通过在顶部添加一个工具栏对布局进行了修改 似乎该工具栏现在遮盖了进度栏 如何使该进度条在屏幕中央的某个位置可见 非常感谢您的帮助 布局xml代码如下所示 活动登录 xml
  • Chrome、Safari 和 Firefox 中内联块元素之间的幽灵空间 [重复]

    这个问题在这里已经有答案了 如何删除内联块元素之间的幽灵空间 这是一个jsfiddlehttp jsfiddle net hFDcV http jsfiddle net hFDcV 您可以清楚地看到 div 之间的水平空间 StackOve
  • 忽略实体框架中的特定列? [复制]

    这个问题在这里已经有答案了 我从实体框架版本 4 1 10331 0 中的数据库自动生成了模型 我想忽略实体中的列 而不使用 Fluent Api 且不更改ObjectContext into DbContext 当然 不会从 SQL 表中
  • 使用 pdfmake 在段落周围添加边框

    我正在通过生成pdfpdfmake http bpampuch github io pdfmake 假设我有这样的 pdf 内容 var docDefinition content Lorem ipsum dolor sit amet co
  • Python 中的字符串是池化的吗?

    Python 是否有一个所有字符串的池 并且它们 字符串 是单例吗 更准确地说 在下面的代码中 是在内存中创建了一个还是两个字符串 a str num b str num 字符串在 Python 中是不可变的 因此实现可以决定是否实习 这是
  • heroku 上的 Hapi 服务器无法绑定端口

    我正在为 ReactJS 应用程序开发 Hapi 服务器 但当我尝试部署到 Heroku 时 收到 R10 错误 无法在启动后 60 秒内绑定到 PORT 到底是怎么回事 我正在使用 process env PORT 我也尝试过 parse
  • Web 应用程序安全的好指南? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我非常擅长制作网络应用程序 并且知道如何在客户端 服务器等之间传输数据 尽管学习如何使数据交换更安全 但我需要一些帮助 这就是为什么我有点害怕发
  • 如何在 C++ 中存储变量数据

    我正在创建一个存储有关特定数据源的元数据的类 元数据采用树状结构 与 XML 的结构非常相似 元数据值可以是整数 小数或字符串值 我很好奇 C 中是否有一种好方法来存储这种情况的变体数据 我希望变体使用标准库 因此我避免使用可用的 COM
  • Numba:如何抑制

    我的 numba 代码中不断出现此错误 Warning 101 0 Unused argument self 我的 numba 代码如下 如何抑制错误消息 autojit def initialise output data self in
  • 使用 $switch 将分数添加到 MongoDB 聚合

    我正在尝试根据哪个值向我的 mongodb 聚合添加一个分数name字段匹配 例如 如果name与 sitt 完全匹配 得分为100 如果name匹配 sitt i 得分为 50 这是我的代码 db getCollection tags a
  • 构造函数参数的求值顺序[重复]

    这个问题在这里已经有答案了 假设我有这门课 struct A A int int int 我这样初始化它 A a b c 功能在哪里a b and c 全部返回int 应该a 之前被调用b and b before c 我对标准中的以下段落
  • Three.js - 获取鼠标单击的 X、Y 和 Z 坐标

    我在用着版本68三个 js 我想单击某处并获取 X Y 和 Z 坐标 我按照此处的步骤操作 但它们给我的 Z 值为 0 鼠标 画布 X Y 到 Three js 世界 X Y Z https stackoverflow com questi
  • tweepy OAuthHandler 错误

    我是新来的 对 python 没有经验 如果问题很微不足道 很抱歉 我有这个简单的脚本 用于获取给定 Twitter 用户的关注者 import time import tweepy consumer key xxx consumer se
  • 为什么我们需要虚拟表?

    我正在寻找一些有关虚拟表的信息 但找不到任何易于理解的内容 有人能给我一些很好的例子和解释吗 如果没有虚拟表 您将无法使运行时多态性发挥作用 因为对函数的所有引用都将在编译时绑定 一个简单的例子 struct Base virtual vo
  • Ajax 调用以 Base64 字符串形式返回 PDF 文件

    我在 Angular JS 环境中使用 ajax 来调用本地文件 pdf 文件 调用成功 但是ajax调用返回的数据是乱码 不确定我这里使用的术语是否正确 但就像使用文本编辑器打开pdf文件一样 无论如何 我可以得到 base64 字符串的
  • 使用Retrofit 2.0和RxJava获取响应状态代码

    我正在尝试升级到 Retrofit 2 0 并在我的 android 项目中添加 RxJava 我正在进行 api 调用 并希望在服务器出现错误响应时检索错误代码 Observable