Estoy usando Retrofit 2.0.0-beta1 .
En las pruebas tengo un escenario alternativo y espero el error HTTP 400
Me gustaria tener retrofit.Response<MyError> response
masresponse.body() == null
MyError no está deserializado, solo lo veo aquí
response.errorBody().string()
pero no me da MyError como objeto
Respuestas:
Actualmente uso una implementación muy fácil, que no requiere el uso de convertidores o clases especiales. El código que uso es el siguiente:
fuente
ErrorResponse es su objeto de respuesta personalizado
Kotlin
Java
fuente
gson.fromJson(response.errorBody()?.charStream(), type)
Lo resolví por:
Clase MyErrorMessage:
fuente
.addConverterFactory(ScalarsConverterFactory.create())
@RonelGonzalesEn Retrofit 2.0 beta2 esta es la forma en que obtengo respuestas de error:
Sincrónico
Asincrónico
Actualización para Retrofit 2 beta3:
Asíncrono: el parámetro de modificación se eliminó de onResponse
fuente
List<BasicResponse>
?En https://stackoverflow.com/a/21103420/2914140 y https://futurestud.io/tutorials/retrofit-2-simple-error-handling, esta variante se muestra para Retrofit 2.1.0.
fuente
Cree un modelo de respuesta de error y usuario Gson para convertir la respuesta a él. Esto simplemente funcionará bien.
APIError.java
MainActivity.java (solicitud interna en respuesta)
fuente
fuente
Lo hice de esta manera para llamadas asíncronas usando Retrofit 2.0-beta2:
fuente
Si usa Kotlin, otra solución podría ser crear una función de extensión para la clase Response:
Uso
fuente
En realidad es muy sencillo.
Kotlin:
Java:
Probado en la actualización: 2.5.0. Lea el texto de charStream que le dará una Cadena, luego analice a JSONObject.
Adios
fuente
readText()
extensión en java,TextStreamsKt.readText(response.errorBody().charStream())
Estaba enfrentando el mismo problema. Lo resolví con la modificación. Déjame mostrarte esto ...
Si su estructura de error JSON es como
Y esta es mi clase de estado de error
Ahora necesitamos una clase que pueda manejar nuestro json.
Ahora podemos verificar nuestra respuesta en la actualización de la llamada API
Eso es todo, ahora puedes mostrar tu brindis
fuente
Aquí hay una solución elegante usando
Kotlin
extensiones:y uso:
showError(retrofitThrowable.getApiError()?.message)
fuente
De esta manera, no necesita una instancia de Retrofit si solo está inyectando un servicio creado a partir de Retrofit.
Úselo así:
fuente
Leer errorBody en una cadena y analizar manualmente json.
fuente
Este parece ser el problema cuando usa OkHttp junto con Retrofit, por lo que puede eliminar OkHttp o usar el código a continuación para obtener el cuerpo del error:
fuente
resuelto por:
fuente
JacksonConverterFactory
aGsonConverterFactory
Convierte JSON en mi objeto personalizado pero da aviso sin control retrofit.Converter fundido <captura <>>?fuente
En Kotlin:
fuente
Los valores de errorBody deben establecer el objeto APIError en Retrofit. Para que pueda usar la siguiente estructura de código.
fuente
Probado y funciona
fuente
fuente