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
...
onNext
termasuk 404, dll. Saya menggunakan Retrofit v2.0.0-beta3.GsonConverterFactory
, sama sepertiRetrofit retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
, Bagaimana cara mendapatkan respon aslinya?Response
. Saya jarang menggunakannya juga - tetapi saya pikir ada baiknya mengetahui bahwa itu ada.Di dalam metode onError, masukkan ini untuk mendapatkan kode
sumber
HttpException
. Saya menggunakan RxJava dan saya perlu mengurai respons setelah menerima fileHTTP 400 BAD REQUEST
. Terima kasih banyak!Anda harus mencatat bahwa pada Retrofit2 semua respons dengan kode 2xx akan dipanggil dari callback onNext () dan kode HTTP lainnya seperti 4xx, 5xx akan dipanggil pada callback onError () , menggunakan Kotlin saya telah menemukan sesuatu seperti ini di onError () :
sumber