Retrofit callback obtener cuerpo de respuesta

Estoy probando Retrofit para compararlo con Volley y estoy luchando para obtener la respuesta de mis peticiones. Por ejemplo, hago algo como esto:

RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("http://localhost:8080") .build(); MyService service = restAdapter.create(MyService.class); service.getToto("toto", new Callback<Toto>() { @Override public void success(Toto toto, Response response) { // Try to get response body BufferedReader reader = null; StringBuilder sb = new StringBuilder(); try { reader = new BufferedReader( new InputStreamReader(response.getBody().in())); String line; try { while ((line = reader.readLine()) != null) { sb.append(line); } } catch (IOException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } String result = sb.toString(); } @Override public void failure(RetrofitError error) {} }); 

Funciona, el objeto toto está establecido, pero para propósitos de prueba, también quiero mostrar la respuesta JSON devuelta por el servidor.

Así que estoy tratando de leer el InputStream de response.getBody() que es un TypedInputStream . Desafortunadamente, siempre obtengo una IOException : Stream is closed .

Intenté utilizar la clase de Utils de Retrofit pero consigo el mismo error de IOException .

Dentro de los corchetes angulares de la devolución de llamada escribir "Respuesta" y luego extraer la secuencia de esta respuesta.

 service.getToto("toto", new Callback<Response>() { @Override public void success(Response result, Response response) { //Try to get response body BufferedReader reader = null; StringBuilder sb = new StringBuilder(); try { reader = new BufferedReader(new InputStreamReader(result.getBody().in())); String line; try { while ((line = reader.readLine()) != null) { sb.append(line); } } catch (IOException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } String result = sb.toString(); } @Override public void failure(RetrofitError error) { } }); 

Antes de Retrofit 2.0

  String bodyString = new String(((TypedByteArray) response.getBody()).getBytes()); 

Retrofit 2.0

  String bodyString = new String(response.body().bytes()); 

Si establece .setLogLevel(RestAdapter.LogLevel.FULL) en el RestAdapter que utiliza para crear el servicio, debe obtener la salida de respuesta de JSON sin procesar en la consola de depuración.

 RestAdapter restAdapter = new RestAdapter.Builder() .setServer("http://my_lovely_api.com") .setLogLevel(RestAdapter.LogLevel.FULL) .build(); mService = restAdapter.create(MyService.class); 

Si desea hacer algo diferente con esta respuesta sin procesar, todavía puede usar el código que tiene en su bloque de éxito para crear una cadena JSON asumiendo que mantiene el LogLevel.FULL en el método setLogLevel , si no, entonces no analizará el InputStream de response.getBody().in() In response.getBody().in() ya que ya se ha leído y cerrado.

Recientemente he encontrado un problema similar. Quería ver algunos json en el cuerpo de la respuesta, pero no quería lidiar con el TypedByteArray de Retrofit. Encontré que la manera más rápida de conseguir alrededor de él era hacer un Pojo (llano viejo objeto de Java) con un solo campo de la secuencia. Más Generalmente harías un Pojo con un campo correspondiente a los datos que quisieras ver.

Por ejemplo, digamos que estaba haciendo una solicitud en la que la respuesta del servidor era una sola cadena en el cuerpo de la respuesta llamada "access_token"

Mi Pojo sería así:

 public class AccessToken{ String accessToken; public AccessToken() {} public String getAccessToken() { return accessToken; } } 

Y entonces mi devolución de llamada se vería así

 Callback<AccessToken> callback = new Callback<AccessToken>() { @Override public void success(AccessToken accessToken, Response response) { Log.d(TAG,"access token: "+ accessToken.getAccessToken()); } @Override public void failure(RetrofitError error) { Log.E(TAG,"error: "+ error.toString()); } }; 

Esto le permitirá ver lo que recibió en la respuesta.

Por favor, no use streams y straemReaders para esto. Utilice soluciones inteligentes como square does:

 private Response logAndReplaceResponse(String url, Response response, long elapsedTime) 

http://www.programcreek.com/java-api-examples/index.php?source_dir=retrofit-jaxrs-master/retrofit/src/main/java/retrofit/RestAdapter.java

ejemplo:

 private String getResponseBody(Response response) { String result = ""; //Try to get response body if (response.getBody() instanceof TypedByteArray) { TypedByteArray b = (TypedByteArray) response.getBody(); result = new String(b.getBytes()); } return result; } 

Otra solución sería hacer algo como lo siguiente:

  private static String bodyAsString(RequestBody body) { try { Buffer buffer = new Buffer(); body.writeTo(buffer); return buffer.readString(body.contentType().charset()); } catch (IOException e) { throw new RuntimeException(e); } } 

Tomado de https://github.com/square/okhttp/blob/master/okcurl/src/test/java/com/squareup/okhttp/curl/MainTest.java#L93-L101

Con la versión 2.1.0, puede obtener el contenido como

 public void onResponse(Call<T> call, Response<T> response) { String errorString = response.errorBody().string(); } 

Sólo hazlo así:

 ModelClass modelclass=response.response.body() System.out.println("****************-----retro rsp----1-------"+modelclass.getMessage()); 

En su modelo de respuesta, pulse cmd + n y anule el método "toString" y solo llame como response.toString ();

 @Override public String toString() { return "{" + "key_one='" + var_keyone + '\'' + ", key_two='" + var_keytwo + '\'' + '}'; } 
  • ¿Cómo puedo enviar una matriz de objetos en un POST retrofit?
  • RestAdapter (retrofit) no se resuelve en android
  • ¿Está haciendo la llamada de red segura en ArrayAdapter?
  • ¿Cómo agregar múltiples del mismo parámetro / array usando Retrofit?
  • No se puede crear el convertidor para la clase com.squareup.okhttp.ResponseBody
  • Uso de URLs absolutas con Retrofit
  • ¿Existe una forma de reutilizar el código del constructor para la adaptación
  • Retrofit 2: URL dinámica
  • Android Retrofit - cómo sustituir baseUrl
  • RETROFIT POST Objeto Realm
  • Uso de la función de activación de llamadas en Retrofit
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.