Obtenga el código de estado de la respuesta utilizando Retrofit 2.0 y RxJava

Estoy tratando de actualizar a Retrofit 2.0 y agregar RxJava en mi proyecto android. Estoy haciendo una llamada api y quiero recuperar el código de error en caso de una respuesta de error del servidor.

Observable<MyResponseObject> apiCall(@Body body); 

Y en la llamada de RxJava:

 myRetrofitObject.apiCall(body).subscribe(new Subscriber<MyResponseObject>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(MyResponseObject myResponseObject) { //On response from server } }); 

En Retrofit 1.9, el RetrofitError todavía existía y podríamos obtener el estado haciendo:

 error.getResponse().getStatus() 

¿Cómo haces esto con Retrofit 2.0 usando RxJava?

En lugar de declarar la llamada a la API como lo hiciste:

 Observable<MyResponseObject> apiCall(@Body body); 

También se puede declarar 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, eg UnknownHostException, will end up here } @Override public void onNext(Response<StartupResponse> startupResponseResponse) { Timber.d("onNext: %s", startupResponseResponse.code()); // HTTP errors, eg 404, will end up here! } } 

Por lo tanto, las respuestas del servidor con un código de error también se entregarán en onNext y puede obtener el código llamando a reponse.code() .

http://square.github.io/retrofit/2.x/retrofit/retrofit/Response.html

EDIT: OK, finalmente me puse a mirar en lo que e-nouri dijo en su comentario, a saber, que sólo los códigos 2xx a to 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 objeto de Response por Retrofit.

Si, por otra parte, la llamada es declarada así:

 Observable<MyResponseObject> apiCall(@Body body); 

o esto

 Observable<ResponseBody> apiCall(@Body body); 

De hecho sólo las respuestas 2xx irán a onNext . Todo lo demás se envuelve en una HttpException y se envía a onError . ¿Qué también tiene sentido, porque sin el envoltorio de Response , lo que debe ser emitido a onNext ? Dado que la solicitud no tuvo éxito, la única cosa sensata a emitir sería null

Dentro del método onError poner a esto obtener el código

 ((HttpException) e).code() 

Debe tener en cuenta que a partir de Retrofit2 todas las respuestas con el código 2xx se llamará desde onNext () de devolución de llamada y el resto de los códigos HTTP como 4xx, 5xx se llamará en el onError () de devolución de llamada, utilizando Kotlin he llegado con algo como Esto en el onError () :

 mViewReference?.get()?.onMediaFetchFinished(downloadArg) if (it is HttpException) { val errorCode = it.code() mViewReference?.get()?.onMediaFetchFailed(downloadArg,when(errorCode){ HttpURLConnection.HTTP_NOT_FOUND -> R.string.check_is_private else -> ErrorHandler.parseError(it) }) } else { mViewReference?.get()?.onMediaFetchFailed(downloadArg, ErrorHandler.parseError(it)) } 
  • Retrofit no puede crear adaptador de llamada
  • RxJava y MVP en la aplicación para Android
  • RxJava HashMap Transformación
  • Retrofit no desencadena onError cuando se utiliza ErrorHandler personalizado
  • RxJava como bus de eventos en proyecto Android - eliminar evento del bus
  • RxJava patrón para solicitar un remoto Observable con una caché temporal
  • AsyncTask en RxJava
  • Uso de "skipWhile" combinado con "repeatWhen" en RxJava para implementar el sondeo de servidor
  • Cómo manejar el `IllegalArgumentException` en RxJava?
  • No vuelva a ejecutar la llamada de Retrofit si todavía está en curso con RxJava 2
  • Cuándo cancelar una suscripción
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.