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..."); } }); 

2 Solutions collect form web for “Cómo manejar el error en Retrofit 2.0”

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).

  • Prueba de unidad de Android con Retrofit2 y Mockito o Robolectric
  • Retrofit. Java.net.ProtocolException: esperado * bytes pero recibido *
  • Cómo crear varias devoluciones de Retrofit en el mismo fragmento - android
  • ¿Cómo imprimir bastante en Retrofit 2?
  • Manejo de errores de llamada síncrono de Retrofit 2 para errores 4xx
  • Retrofit 2: Obtener el cuerpo de JSON from Response
  • Retrofit2 (interceptor) + GoogleApiClient cómo actualizar token
  • Android Retrofi 2, las diferencias entre addInterceptor y addNetworkInterceptor para editar las respuestas
  • Retrofit: el servidor devuelve tanto ETag como Cache-Control: max-age = 60. ¿No debería utilizarse la memoria caché si se solicita <60s?
  • Retrofit2 ¿Datos de formulario codificados estáticos?
  • No hay ningún error de este tipo al usar robospice-retrofit y getstream.io
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.