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

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:

  1. ¿Hay alguna manera de obtener una referencia al convertidor por defecto usado por retrofit?
  2. ¿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)
  3. ¿Hay alguna otra forma de obtener la respuesta cruda y convertida en modo de sincronización?

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(); 
  • Formulario Retrofit Codificado y Multipart en solicitud individual
  • ¿Hay alguna manera de agregar parámetros de consulta a cada solicitud con Retrofit 2?
  • RETROFIT POST Objeto Realm
  • Uso de Retrofit en Android
  • ¿Cómo se maneja el error en Retrofit 2? ¿No encuentro la clase RetrofitError que sugiere la mayoría de las soluciones?
  • Método retrofit 2.0 sin respuesta
  • Uso de Retrofit consiguiendo error onFailure: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: closed
  • Obtener una matriz JSON de retrofit Response
  • Excepción Outofmemory utilizando la biblioteca retrofit android
  • Retrofit 2 elimina los caracteres después de hostname de url de base
  • Uso de Retrofit para acceder a los arrays JSON
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.