Yaptığınız gibi API çağrısını bildirmek yerine:
Observable<MyResponseObject> apiCall(@Body body);
Bunu şu şekilde de ilan edebilirsiniz:
Observable<Response<MyResponseObject>> apiCall(@Body body);
Daha sonra aşağıdaki gibi bir Aboneye sahip olacaksınız:
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!
}
}
Böylece hata kodlu sunucu yanıtları da gönderilecek onNextve kodu arayarak alabilirsiniz reponse.code().
http://square.github.io/retrofit/2.x/retrofit/retrofit/Response.html
DÜZENLEME: Tamam, sonunda e-nouri'nin yorumlarında ne söylediğini araştırmaya başladım, yani sadece 2xx kodları bunu yapacak onNext. İkimizin de haklı olduğu ortaya çıktı:
Çağrı böyle ilan edilirse:
Observable<Response<MyResponseObject>> apiCall(@Body body);
hatta bu
Observable<Response<ResponseBody>> apiCall(@Body body);
onNexthata kodlarına bakılmaksızın tüm yanıtlar verilecektir . Bu mümkündür çünkü her şey ResponseRetrofit ile bir nesneye sarılır .
Öte yandan, çağrı şu şekilde ilan edilirse:
Observable<MyResponseObject> apiCall(@Body body);
veya bu
Observable<ResponseBody> apiCall(@Body body);
gerçekten de sadece 2xx yanıtları gidecek onNext. Diğer her şey bir içine sarılıp HttpExceptionadresine gönderilecek onError. Hangi nedeniyle de olmadan, mantıklı Response, ne sarmalayıcı gerektiğini yayılacaktır onNext? İsteğin başarılı olmadığı göz önüne alındığında, yayılması gereken tek mantıklı şey null...