而不是像您那样声明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
包装器,should到onNext
会发出什么信号?考虑到请求没有成功,唯一明智的做法是emits null
...