Au lieu de déclarer l'appel API comme vous l'avez fait:
Observable<MyResponseObject> apiCall(@Body body);
Vous pouvez également le déclarer comme ceci:
Observable<Response<MyResponseObject>> apiCall(@Body body);
Vous aurez alors un abonné comme le suivant:
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!
}
}
Ainsi, les réponses du serveur avec un code d'erreur seront également envoyées à onNextet vous pouvez obtenir le code en appelant reponse.code().
http://square.github.io/retrofit/2.x/retrofit/retrofit/Response.html
EDIT: OK, j'ai finalement commencé à regarder ce que e-nouri disait dans leur commentaire, à savoir que seuls les codes 2xx le feront onNext. Il s'avère que nous avons tous les deux raison:
Si l'appel est déclaré comme ceci:
Observable<Response<MyResponseObject>> apiCall(@Body body);
ou même ça
Observable<Response<ResponseBody>> apiCall(@Body body);
toutes les réponses aboutiront onNext, quel que soit leur code d'erreur. Ceci est possible car tout est enveloppé dans un Responseobjet par Retrofit.
Si, au contraire, l'appel est déclaré comme ceci:
Observable<MyResponseObject> apiCall(@Body body);
ou ca
Observable<ResponseBody> apiCall(@Body body);
en effet, seules les réponses 2xx iront à onNext. Tout le reste sera emballé dans un HttpExceptionfichier et envoyé à onError. Ce qui a également du sens, car sans le Responsewrapper, à quoi doit- on émettre onNext? Étant donné que la demande n'a pas abouti, la seule chose sensée à émettre serait null...