使用Retrofit2和rxJava2处理没有主体的响应

Vad*_*ovs 1 android rx-java retrofit retrofit2 rx-java2

我有一个WS,如果成功则返回200,没有任何正文,否则返回420,错误正文中的json不成功

返回类型为

Observable<Response<Void>>
Run Code Online (Sandbox Code Playgroud)

出于某种原因,如果出现420代码错误,onNext(Response<Void> value)则调用onError(Throwable e)该代码,而不是针对其他任何不成功的请求调用该代码。

为什么仅在这种情况下才调用onNext而不是onError?如果请求未返回200,则可以调用onError?

yos*_*riz 5

这正是使用时的预期行为Response,任何状态码都封装为一个Response对象,并通过发出onNext()。而任何其他类型的异常(网络错误/解析错误/某些其他配置错误)将作为Exception交付onError()

使用裸对象方法(Observable<T>/ Observable<Void>),对于从服务器获取响应和成功解析响应以外的任何其他情况,您将获得onError()

如果是RxJava2,Observable<Void>则不再有效,因为不能发出null(RxJava2不再允许),而应使用Completable

使用Response,您可以包装一个Error处理程序,例如用于特定的服务器错误代码。(你可以在我的答案看到一个例子在这里

此外,还有一种Result类型可以封装任何错误类型和a(Response如果有)。