¿Cómo puedo convertir un cuerpo de respuesta exitoso en un tipo específico usando retrofit?
En las llamadas de actualización de modo asíncrono
public void success(T t, Response rawResponse)
Fueron t es la respuesta convertida, y rawResponse es la respuesta en bruto. Esto le proporciona acceso tanto a la respuesta sin procesar como a la respuesta convertida.
- Cómo obtener archivos xml gziped con retrofit?
- Retrofit v2.0.0-beta2 cómo cargar archivos usando RequestBody
- No se puede crear el convertidor para la clase com.squareup.okhttp.ResponseBody
- Cómo manejar una cola para repetir solicitudes después de un fallo de red con retroadaptación
- Uso de URLs absolutas con Retrofit
En el modo de sincronización puede obtener la respuesta convertida O la respuesta en bruto
Respuesta convertida
@GET("/users/list") List<User> userList();
Respuesta en bruto
@GET("/users/list") Response userList();
El objeto Response tiene un método para obtener el cuerpo
TypedInput getBody()
Y la api retrofit tiene una clase convertidor que puede convertir esto a un objeto java
Object fromBody(TypedInput body,Type type)
Pero no puedo averiguar cómo obtener una instancia del objeto Converter
Podría ser capaz de crear una instancia de la clase Converter, pero eso requeriría el conocimiento del objeto Gson utilizado para crear el RestAdapter, al que tal vez no tenga acceso. Idealmente, me gustaría obtener una referencia al objeto convertidor directamente el RestAdpater.
Cualquiera de los siguientes responderá mi pregunta:
- ¿Hay alguna manera de obtener una referencia al convertidor por defecto usado por retrofit?
- ¿Alguien sabe cómo se construye el convertidor por defecto? (No hay ningún constructor por defecto y hay dos Constructores
public GsonConverter(Gson gson)
y público GsonConverter (Gson Gson, String charset) - ¿Hay alguna otra forma de obtener la respuesta cruda y convertida en modo de sincronización?
- Retrofit 2 - cuerpo de respuesta nula
- ¿Debo usar retrofit con un singleton?
- ¿Necesita ayuda en el archivo de imagen múltiple POST usando retrofit?
- Retrofit: cómo arreglar "sólo se permite un método http. Encontrado: obtener y obtener "?
- Cómo utilizar interceptor para agregar encabezados en Retrofit 2.0
- Retrofit 2.0 OnFailure - Respuesta sin procesar
- Retrofit @GET - cómo mostrar la cadena de solicitud?
- Detener y reanudar las descargas utilizando Retrofit
A continuación se muestra un ejemplo de una clase StringConverter
que implementa el Converter
encuentra en la modificación. Básicamente usted tendrá que anular el fromBody()
y decirle lo que quiere.
public class StringConverter implements Converter { /* * In default cases Retrofit calls on GSON which expects a JSON which gives * us the following error, com.google.gson.JsonSyntaxException: * java.lang.IllegalStateException: Expected BEGIN_OBJECT but was * BEGIN_ARRAY at line x column x */ @Override public Object fromBody(TypedInput typedInput, Type type) throws ConversionException { String text = null; try { text = fromStream(typedInput.in()); } catch (IOException e) { e.printStackTrace(); } return text; } @Override public TypedOutput toBody(Object o) { return null; } // Custom method to convert stream from request to string public static String fromStream(InputStream in) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder out = new StringBuilder(); String newLine = System.getProperty("line.separator"); String line; while ((line = reader.readLine()) != null) { out.append(line); out.append(newLine); } return out.toString(); } }
Al aplicar esto a su solicitud, tendrá que hacer lo siguiente:
// initializing Retrofit's rest adapter RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(ApiConstants.MAIN_URL).setLogLevel(LogLevel.FULL) .setConverter(new StringConverter()).build();
- Actualización de Android Studio 2.2: alineado APK (zipAlign) no generado con el nuevo Gradle Plugin 2.2.0
- Cómo recuperar Twitter y Facebook Autenticación y Token a través de las clases de Administrador de cuentas de Android