Retrofit 2 + Rxjava error de manipulación

Así que ya recibir un token de la Json cuando el inicio de sesión se realiza sin problemas, y recibir el hash

Pero cuando la respuesta del servidor es un error, no puedo obtener el mensaje de Json ({message: "Error: email incorrecto}" porque en el onError sólo obtenemos como argumento una Throwable y no una clase de modelo como en on

¿Cómo puedo obtener un mensaje json del servidor onError ??

final Observable<TokenResponse> observable = Service.login(userCredentials); observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<TokenResponse>() { String error=""; @Override public void onCompleted() { mLoginView.whenLoginSucess(); } @Override public void onError(Throwable e) { if (e instanceof HttpException) { HttpException exception = (HttpException) e; Response response = exception.response(); Converter<ResponseBody, ErrorFromServer> converter = new GsonConverterFactory() .responseBodyConverter(ErrorFromServer.class, Annotation[0]); ErrorFromServer error = converter.convert(response.errorBody()); } mLoginView.errorText(error); e.printStackTrace(); } @Override public void onNext(TokenResponse tokenResponse) { SharedPreferences.Editor editor = sharedP.edit(); editor.putString("hash", tokenResponse.getToken()); editor.commit(); //getString return key value "hash" if there is no value, returns null hash = sharedP.getString("hash",null); } }); 

Código TokenResponse

 public class TokenResponse { @SerializedName("hash") @Expose private String token; @SerializedName("message") @Expose private String message; public String getMessage() {return message;} public String getToken() { return token; } 

}

He encontrado una solución, tengo una clase de aplicación que crea un Retrofit y luego acabo de crear un ResponseBody y convertido usando responseBodyConverter ( , )

  @Override public void onError(Throwable e) { if (e instanceof HttpException) { ResponseBody body = ((HttpException) e).response().errorBody(); Converter<ResponseBody, Error> errorConverter = application.getRetrofit().responseBodyConverter(Error.class, new Annotation[0]); // Convert the error body into our Error type. try { Error error = errorConverter.convert(body); Log.i("","ERROR: " + error.message); mLoginView.errorText(error.message); } catch (IOException e1) { e1.printStackTrace(); } } static class Error{ String message; } 

El JSon recibido fue {"error": 4041, "mensaje": "Email no encontrado"} thas por qué la clase Error, acabo de crear un mensaje variable porque solo quiero mostrar el mensaje al usuario

Está mezclando un error lógico (el inicio de sesión ha fallado por alguna razón) con un error de aplicación. Si su servidor envía una respuesta con HTTP 200 y un json válido en caso de un inicio de sesión fallido, su aplicación no llamará onError en absoluto.

Así que, básicamente, usted necesita para comprobar la respuesta (con éxito) del servidor y decidir sobre la base de la proporcionada json si el inicio de sesión fue exitosa o no.

OnError debe llamarse, por ejemplo, en caso de que el servidor no sea accesible o no pueda entregar una respuesta válida.

Editar: No sé lo que su TokenResponse contiene, pero básicamente la respuesta para un inicio de sesión debe ser el mismo, no importa si tuvo éxito o no. A continuación, sólo compruebe el TokenResponse para averiguar si el resultado contiene errores o no.

Compruebe esta respuesta como un ejemplo: https://stackoverflow.com/a/31159671/180538

  • Obtenga el valor actual de RxJava Observable
  • Encadenamiento de RxJava observables con callbacks / listeners
  • Inter fragmento de comunicación utilizando rxjava
  • Error al resolver la dependencia de RXJava
  • Obtención de información de encabezado con RXJava y Retrofit
  • Comportamiento de onNext y onComplete
  • Usando observeOn () el hilo de interfaz de usuario de Android bloquea mi prueba de emulador
  • Retorno combinado observable sólo si una condición coincide
  • Manera correcta de manejar ninguna red con Retrofit y RX-java
  • RxJava: ¿Cómo reanudar el trabajo de un observable si se produce un cambio de configuración?
  • AbstractMethodError cuando se utiliza RxJavaCallAdapterFactory en Retrofit 2
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.