Alih-alih mendeklarasikan panggilan API seperti yang Anda lakukan:
Observable<MyResponseObject> apiCall(@Body body);
Anda juga bisa mendeklarasikannya seperti ini:
Observable<Response<MyResponseObject>> apiCall(@Body body);
Anda kemudian akan memiliki Pelanggan seperti berikut:
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!
}
}
Jadi, respons server dengan kode kesalahan juga akan dikirimkan ke onNextdan Anda bisa mendapatkan kode tersebut dengan menelepon reponse.code().
http://square.github.io/retrofit/2.x/retrofit/retrofit/Response.html
EDIT: Oke, akhirnya saya sempat melihat apa yang dikatakan e-nouri dalam komentar mereka, yaitu hanya kode 2xx yang mau onNext. Ternyata kami berdua benar:
Jika panggilan dideklarasikan seperti ini:
Observable<Response<MyResponseObject>> apiCall(@Body body);
atau bahkan ini
Observable<Response<ResponseBody>> apiCall(@Body body);
semua tanggapan akan berakhir onNext, terlepas dari kode kesalahannya. Ini dimungkinkan karena semuanya dibungkus dalam sebuah Responseobjek oleh Retrofit.
Sebaliknya, jika panggilan tersebut dinyatakan seperti ini:
Observable<MyResponseObject> apiCall(@Body body);
atau ini
Observable<ResponseBody> apiCall(@Body body);
memang hanya tanggapan 2xx yang akan diberikan onNext. Segala sesuatu yang lain akan dibungkus HttpExceptiondan dikirim ke onError. Yang juga masuk akal, karena tanpa Responsepembungkusnya, apa yang harus dipancarkan onNext? Mengingat bahwa permintaan itu tidak berhasil, satu-satunya hal yang masuk akal untuk dikeluarkan adalah null...