【问题标题】:Handling response with no body with Retrofit2 and rxJava2使用 Retrofit2 和 rxJava2 处理没有正文的响应
【发布时间】:2017-10-27 07:04:51
【问题描述】:

我有一个 WS,如果成功则返回 200 而没有正文 或 420 with json in error body 不成功

返回类型是

Observable<Response<Void>>

由于某种原因,如果出现 420 代码错误,则调用 onNext(Response&lt;Void&gt; value) 而不是调用任何其他不成功请求的 onError(Throwable e)

为什么只在这种情况下调用 onNext 而不是 onError ?如果请求没有返回200,是否可以调用onError?

【问题讨论】:

  • 尝试 Observable 而不是 Observable>
  • 我是否使用 Observable 我在 onError(Throwable e) 中得到空指针

标签: android retrofit rx-java retrofit2 rx-java2


【解决方案1】:

这正是使用Response 时的预期行为,任何类型的状态代码都被封装为Response 对象,并与onNext() 一起发出。而任何其他类型的异常(网络错误/解析错误/一些其他配置错误)都将在onError() 中作为异常传递。

使用裸对象方法(Observable&lt;T&gt;/Observable&lt;Void&gt;),除了从服务器获得响应并且成功解析响应之外的任何其他情况,您将获得onError()

在 RxJava2 的情况下,Observable&lt;Void&gt; 不再有效,因为不能发出 null(RxJava2 不再允许),您应该使用 Completable

使用Response,您可以为特定的服务器错误代码封装一个错误处理程序。 (你可以在我的回答here看到一个例子)

此外,还有封装任何错误类型的Result 类型和Response(如果有)。

【讨论】:

  • 如果我使用 Observable 并收到没有正文的 200,我会得到一个空指针而不是 onNext 调用
  • 由于 rxJava2 不支持空值,我需要使用 Response 并在 onNext 中进行错误处理
  • 是的,你是对的,你应该使用 Completable 和 RxJava2,回答更新。
  • 尝试了不同的方法,使用 Completable 最适合我的情况。
猜你喜欢
  • 2018-03-05
  • 1970-01-01
  • 2017-06-14
  • 2019-07-13
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
相关资源
最近更新 更多