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
- RXJava - Dividir y combinar un Observable
- Proguard y RxAndroid V1.1.0
- Dar un RxJava Observable algo a emitir de otro método
- ¿Cuál es la diferencia entre RxJava y Bolts?
- Combinación de llamadas API con RX Java
¿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; }
}
- Cómo actualizar la interfaz de usuario desde el servicio de Android utilizando RxJava / RxAndroid
- RxJava, buen caso de uso de flatmap
- Suscribir un cajón de navegación a un Observable
- ¿Cómo rebatir una solicitud reactiva retrofit en java?
- Encontrar falta onError en el proyecto
- Android rxJava Manejo de errores con retroadaptación
- No vuelva a ejecutar la llamada de Retrofit si todavía está en curso con RxJava 2
- Por qué definir Flowable podría recibir actualizaciones de la base de datos
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
- Cómo crear AsymmetricGridView con diferentes tamaños de imagen en fila
- ¿Flujo de datos entre Android BroadcastReceiver, ContentProvider y Activity?