使用 Retrofit2 和 rxJava2 处理没有 body 的响应
Handling response with no body with Retrofit2 and rxJava2
我有一个 returns 200 没有 body 如果成功
或 420 json 错误 body 不成功
Return 类型是
Observable<Response<Void>>
出于某种原因,如果出现 420 代码错误,将调用 onNext(Response<Void> value)
而不是 onError(Throwable e)
,后者将被调用用于任何其他不成功的请求。
为什么只在这种情况下调用 onNext 而不是调用 onError?如果请求没有返回 200 是否可以调用 onError?
这正是使用 Response
时的预期行为,任何类型的状态代码都被封装为 Response
对象,并随 onNext()
一起发出。而任何类型的其他异常(网络错误/解析 error/some 其他配置错误)将作为 onError()
中的异常传递。
使用裸对象方法(Observable<T>
/Observable<Void>
),对于除了从服务器得到响应并且响应被成功解析之外的任何其他情况,您将得到onError()
。
在 RxJava2 的情况下,Observable<Void>
不再有效,因为不能发出 null(RxJava2 不再允许),相反你应该使用 Completable
.
使用 Response
,您可以为特定的服务器错误代码包装一个错误处理程序。 (你可以在我的回答中看到一个例子)
此外,还有 Result
类型封装任何错误类型和 Response
如果有的话。
我有一个 returns 200 没有 body 如果成功 或 420 json 错误 body 不成功
Return 类型是
Observable<Response<Void>>
出于某种原因,如果出现 420 代码错误,将调用 onNext(Response<Void> value)
而不是 onError(Throwable e)
,后者将被调用用于任何其他不成功的请求。
为什么只在这种情况下调用 onNext 而不是调用 onError?如果请求没有返回 200 是否可以调用 onError?
这正是使用 Response
时的预期行为,任何类型的状态代码都被封装为 Response
对象,并随 onNext()
一起发出。而任何类型的其他异常(网络错误/解析 error/some 其他配置错误)将作为 onError()
中的异常传递。
使用裸对象方法(Observable<T>
/Observable<Void>
),对于除了从服务器得到响应并且响应被成功解析之外的任何其他情况,您将得到onError()
。
在 RxJava2 的情况下,Observable<Void>
不再有效,因为不能发出 null(RxJava2 不再允许),相反你应该使用 Completable
.
使用 Response
,您可以为特定的服务器错误代码包装一个错误处理程序。 (你可以在我的回答中看到一个例子
此外,还有 Result
类型封装任何错误类型和 Response
如果有的话。