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 à onNext
et 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 Response
objet 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 HttpException
fichier et envoyé à onError
. Ce qui a également du sens, car sans le Response
wrapper, à quoi doit- on émettre onNext
? Étant donné que la demande n'a pas abouti, la seule chose sensée à émettre serait null
...