En lugar de declarar la llamada a la API como lo hizo:
Observable<MyResponseObject> apiCall(@Body body);
También puedes declararlo así:
Observable<Response<MyResponseObject>> apiCall(@Body body);
A continuación, tendrá un suscriptor como el siguiente:
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!
}
}
Por lo tanto, las respuestas del servidor con un código de error también se enviarán onNexty puede obtener el código llamando a reponse.code().
http://square.github.io/retrofit/2.x/retrofit/retrofit/Response.html
EDITAR: OK, finalmente pude investigar lo que e-nouri dijo en su comentario, es decir, que solo los códigos 2xx lo harán onNext. Resulta que ambos tenemos razón:
Si la llamada se declara así:
Observable<Response<MyResponseObject>> apiCall(@Body body);
o incluso esto
Observable<Response<ResponseBody>> apiCall(@Body body);
todas las respuestas terminarán en onNext, independientemente de su código de error. Esto es posible porque todo está envuelto en un Responseobjeto por Retrofit.
Si, por el contrario, la llamada se declara así:
Observable<MyResponseObject> apiCall(@Body body);
o esto
Observable<ResponseBody> apiCall(@Body body);
de hecho, solo las respuestas 2xx irán a onNext. Todo lo demás será envuelto en un HttpExceptiony enviado a onError. Lo que también tiene sentido, porque sin la Responseenvoltura, ¿a qué se debería emitir onNext? Dado que la solicitud no tuvo éxito, lo único sensato a emitir sería null...
onNextincluyendo 404, etc. Usé Retrofit v2.0.0-beta3.GsonConverterFactory, al igual queRetrofit retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()), ¿Cómo obtener la respuesta original?Response. Rara vez lo uso también, pero creo que es bueno saber que existe.Dentro del método onError pon esto para obtener el código
fuente
HttpException. Estoy usando RxJava y necesitaba analizar la respuesta después de recibir unHTTP 400 BAD REQUEST. ¡Muchas gracias!Debe tener en cuenta que a partir de Retrofit2, todas las respuestas con el código 2xx se llamarán desde la devolución de llamada onNext () y el resto de los códigos HTTP como 4xx, 5xx se llamarán en la devolución de llamada onError () , usando Kotlin, se me ocurrió algo como esto en el onError () :
fuente