而不是像你一样声明API调用:
Observable apiCall(@Body body);
您也可以这样声明:
Observable> apiCall(@Body body);
然后,您将拥有如下所示的订阅者:
new Subscriber>() {
@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 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]
编辑:好的,我终于开始研究e-nouri在评论中所说的内容,即只有2xx代码将发送到onNext.原来我们都是对的:
如果调用声明如下:
Observable> apiCall(@Body body);
甚至这个
Observable> apiCall(@Body body);
无论错误代码如何,所有回复都将以onNext结尾。 这是可能的,因为Retrofit将所有内容包装在onNext对象中。
另一方面,如果调用声明如下:
Observable apiCall(@Body body);
或这个
Observable apiCall(@Body body);
事实上只有2xx的回复将转到onNext.其他所有内容都将包含在HttpException中并发送至onError.这也是有道理的,因为如果没有Response包装,应该向onNext发出什么? 鉴于请求不成功,唯一明智的发射方式是null ......