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 .

9 Solutions collect form web for “Retrofit callback obtener cuerpo de respuesta”

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 + '\'' + '}'; } 
  • IllegalArgumentException en Retrofit / no debe tener bloque de reemplazo
  • Cómo manejar una cola para repetir solicitudes después de un fallo de red con retroadaptación
  • Javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Ancla de confianza para la ruta de certificación no encontrada
  • Detener y reanudar las descargas utilizando Retrofit
  • Retrofit 2.0 OnFailure - Respuesta sin procesar
  • Retrofit v2.0.0-beta2 cómo cargar archivos usando RequestBody
  • Recupere la respuesta http en Retrofit antes de pasarla a la actividad de llamada
  • Reajustar varios parámetros POST
  • Retrofit API para recuperar una imagen png
  • Okclient en Okclient no se puede aplicar a (okhttp3.okhttpclient)
  • ¿Cómo se maneja el error en Retrofit 2? ¿No encuentro la clase RetrofitError que sugiere la mayoría de las soluciones?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.