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 onNext
ve 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);
onNext
hata kodlarına bakılmaksızın tüm yanıtlar verilecektir . Bu mümkündür çünkü her şey Response
Retrofit 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 HttpException
adresine 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
...