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 onNext
y 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 Response
objeto 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 HttpException
y enviado a onError
. Lo que también tiene sentido, porque sin la Response
envoltura, ¿a qué se debería emitir onNext
? Dado que la solicitud no tuvo éxito, lo único sensato a emitir sería null
...
onNext
incluyendo 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