Cómo manejar el error en Retrofit 2.0

Quiero manejar el error en Retrofit 2.0

Got, por ejemplo, code=404 y body=null , pero errorBody() contiene datos en ErrorModel ( Boolean status y String info ).

Esto es errorBody().content : [text=\n{"status":false,"info":"Provided email doesn't exist."}] .

¿Cómo puedo obtener estos datos?

¡Gracias por ayudarme!

Este es mi código para la solicitud de Retrofit:

 ResetPasswordApi.Factory.getInstance().resetPassword(loginEditText.getText().toString()) .enqueue(new Callback<StatusInfoModel>() { @Override public void onResponse(Call<StatusInfoModel> call, Response<StatusInfoModel> response) { if (response.isSuccessful()) { showToast(getApplicationContext(), getString(R.string.new_password_sent)); } else { showToast(getApplicationContext(), getString(R.string.email_not_exist)); } } @Override public void onFailure(Call<StatusInfoModel> call, Throwable t) { showToast(getApplicationContext(), "Something went wrong..."); } }); 

Si desea obtener datos cuando se produce una respuesta de error ( normalmente un código de respuesta excepto 200 ), puede hacerlo así en su método onResponse() :

 if (response.code() == 404) { Gson gson = new GsonBuilder().create(); YourErrorPojo pojo = new YourErrorPojo(); try { pojo = gson.fromJson(response.errorBody().string(), YourErrorPojo.class); Toast.makeText(getApplicationContext(), pojo.getInfo(), Toast.LENGTH_LONG).show(); } catch (IOException e) { } } 

Al generar YourErrorPojo.class siguientes pasos:

  1. Ir a Json Schema 2 Pojo

  2. Pegue su ejemplo Json , y seleccione el tipo de fuente Json , anotación Gson

  3. Su ejemplo Json es: {"status":false,"info":"Provided email doesn't exist."}

  4. Haga clic en Vista previa y generará su clase Pojo para usted.

Agregue esto a su build.gradle : compile 'com.google.code.gson:gson:2.7'

He utilizado Gson en esta solución, pero puede obtener su Json como: response.errorBody().string() y manejar, hacer algo que quieras.

Retrofit no ve 404 como un fracaso, por lo que entrará en el onSuccess.

response.isSuccessful() es true si el código de respuesta está en el rango de 200-300, por lo que entrará en el else allí.

 if (response.isSuccessful()) { showToast(getApplicationContext(), getString(R.string.new_password_sent)); } else { // A 404 will go here showToast(getApplicationContext(), getString(R.string.email_not_exist)); } 

Sin embargo, como su respuesta no tuvo éxito, no obtiene el cuerpo de respuesta con .body() , pero con errorBody() , errorBody se llenará cuando la solicitud sea un éxito, pero response.isSuccessful() devuelve false Un código de estado que no es 200-300).

  • Retrofit. Java.net.ProtocolException: esperado * bytes pero recibido *
  • POST Multipart Form Datos usando Retrofit 2.0 incluyendo imagen
  • ¿Gradle falló con Facebook SDK, Fresco lib y Retrofit?
  • Retrofit 2.0 archivo de múltiples partes que envía sendto falló: ETIMEDOUT (conexión agotada) error
  • Twitter OAuth Rest Api Estado Parámetro '@' symbol
  • Broken Pipe al intentar cargar una actualización de archivo grande 2
  • Renovar 2 verifica la URL de la llamada
  • No se puede analizar el error en Retrofit 2
  • Retrofit2 proguard remove param
  • Runtime Execption java.lang.NoClassDefFoundError: retrofit2.Platform en Android
  • Retrofit 2 Callback onResponse en el subproceso de fondo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.