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
...
onNext
inclure 404, etc. J'ai utilisé Retrofit v2.0.0-beta3.GsonConverterFactory
, tout commeRetrofit retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
, Comment obtenir la réponse d'origine?Response
. Je l'utilise rarement aussi - mais je pense qu'il est bon de savoir qu'il existe.Dans la méthode onError, mettez ceci pour obtenir le code
la source
HttpException
. J'utilise RxJava et j'avais besoin d'analyser la réponse après avoir reçu un fichierHTTP 400 BAD REQUEST
. Merci beaucoup!Vous devez noter qu'à partir de Retrofit2, toutes les réponses avec le code 2xx seront appelées à partir du rappel onNext () et le reste des codes HTTP comme 4xx, 5xx sera appelé sur le rappel onError () , en utilisant Kotlin j'ai trouvé quelque chose comme ceci dans le onError () :
la source