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 onNext
dan 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 Response
objek 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 HttpException
dan dikirim ke onError
. Yang juga masuk akal, karena tanpa Response
pembungkusnya, apa yang harus dipancarkan onNext
? Mengingat bahwa permintaan itu tidak berhasil, satu-satunya hal yang masuk akal untuk dikeluarkan adalah null
...