Retrofit 2.0 cómo imprimir la respuesta json completa?

Me voy de Volley a Retrofit actualmente versión 2.0.

¿Cómo imprimir el código de respuesta completo de json?

Incluye :

compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' compile 'com.squareup.retrofit:retrofit:2.0.0-beta2' 

RestClient :

 OkHttpClient client = new OkHttpClient(); client.interceptors().add(new Interceptor() { @Override public Response intercept(Interceptor.Chain chain) throws IOException { Response response = chain.proceed(chain.request()); return response; } }); Gson gson = new GsonBuilder() .setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'") .create(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(ROOT) .addConverterFactory(GsonConverterFactory.create(gson)) .client(client) .build(); REST_CLIENT = retrofit.create(APIService.class); 

APIService :

  @GET("my/json") Call<Model> getFeed(); 

En Actividad – API de llamada :

 Call<Model> call = RestClient.get().getFeed(); call.enqueue(new Callback<Model>() { @Override public void onResponse(Response<Model> response, Retrofit retrofit) { Log.w("2.0 getFeed > response.raw() => ", response.raw().toString());//DONT WORK Log.w("2.0 getFeed > retrofit => ", retrofit.toString());//DONT WORK Log.w("2.0 getFeed > body => ", response.body().toString()); //DONT WORK Log.w("2.0 getFeed > getStatus => ", response.body().getStatus()); } @Override public void onFailure(Throwable t) { t.printStackTrace(); Log.e("2.0 getFeed > onFailure => ", t.toString()); } }); 

Para imprimir la respuesta completa en json:

 Log.w("2.0 getFeed > Full json res wrapped in gson => ",new Gson().toJson(response)); 

Si desea tener una función de impresión bonita , utilice:

 Log.w("2.0 getFeed > Full json res wrapped in pretty printed gson => ",new GsonBuilder().setPrettyPrinting().create().toJson(response)); 

Tenga en cuenta que esto imprime los datos deserializados (no la respuesta Raw como devuelta desde el servidor). Para obtener la respuesta sin procesar, necesitaría tratar HttpLoggingInterceptor o HttpLoggingInterceptor .

Conecte la siguiente clase de interceptor como esta

 OkHttpClient client = new OkHttpClient(); client.interceptors().add(new LoggingInterceptor()); 

////// Interceptor clase

 public static class LoggingInterceptor implements Interceptor { @Override public com.squareup.okhttp.Response intercept(Chain chain) throws IOException { Log.i("LoggingInterceptor","inside intercept callback"); Request request = chain.request(); long t1 = System.nanoTime(); String requestLog = String.format("Sending request %s on %s%n%s", request.url(), chain.connection(), request.headers()); if(request.method().compareToIgnoreCase("post")==0){ requestLog ="\n"+requestLog+"\n"+bodyToString(request); } Log.d("TAG","request"+"\n"+requestLog); com.squareup.okhttp.Response response = chain.proceed(request); long t2 = System.nanoTime(); String responseLog = String.format("Received response for %s in %.1fms%n%s", response.request().url(), (t2 - t1) / 1e6d, response.headers()); String bodyString = response.body().string(); Log.d("TAG","response only"+"\n"+bodyString); Log.d("TAG","response"+"\n"+responseLog+"\n"+bodyString); return response.newBuilder() .body(ResponseBody.create(response.body().contentType(), bodyString)) .build(); } public static String bodyToString(final Request request) { try { final Request copy = request.newBuilder().build(); final Buffer buffer = new Buffer(); copy.body().writeTo(buffer); return buffer.readUtf8(); } catch (final IOException e) { return "did not work"; } }` 

Cortesía : https://github.com/square/retrofit/issues/1072#

En realidad Square ya crean una clase sólo para esto, solo agrega

 HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor).build(); 

Y, en Retrofit

 Retrofit retrofit = new Retrofit.Builder() .client(client) .baseUrl("https://yourapi.com/api/") .build(); 

La clase interceptora está en maven central

 compile 'com.squareup.okhttp3:logging-interceptor:3.5.0' 

Puede establecer el nivel de registro en la clase HttpLoggingInterceptor. El CUERPO es el verbo (imprime todo al Cuerpo). Más información está disponible en OkHttp github

¡Precaución!

¡No olvide eliminar los Interceptores (o cambiar el Nivel de Registro a NINGUNO) en producción! De lo contrario, la gente podrá ver su solicitud y respuesta en Log Cat.

Prueba esto !!

  Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); /** Handles Log */ retrofit.client().interceptors().add(new LoggingInterceptor()); mRestClient = retrofit.create(RestServices.class); class LoggingInterceptor implements Interceptor { @Override public Response intercept(Interceptor.Chain chain) throws IOException { Request request = chain.request(); long t1 = System.nanoTime(); Logger.d(String.format("Sending request %s on %s%n%s", request.url(), chain.connection(), request.headers())); Response response = chain.proceed(request); long t2 = System.nanoTime(); Logger.d(String.format("Received response for %s in %.1fms%n%s", response.request().url(), (t2 - t1) / 1e6d, response.headers())); final String responseString = new String(response.body().bytes()); Logger.d("Response: " + responseString); return response.newBuilder() .body(ResponseBody.create(response.body().contentType(), responseString)) .build(); } 

¡Compruebe esta demostración !!!

Para obtener respuesta completa en Json en retrofit2.3.0 utilice a continuación.

Esto funciona para mí.

 call.enqueue(new Callback<someList>() { @Override public void onResponse(Call<someList> call, Response<someList> response) { if (response.isSuccessful()) Log.e("Success", new Gson().toJson(response.body())); else Log.e("unSuccess", new Gson().toJson(response.errorBody())); } @Override public void onFailure(Call<someList> call, Throwable t) { Log.e("onFailure", t.toString()); } }); 
 Call<Model> call = RestClient.get().getFeed();call.enqueue(new Callbstrong textack<Model>() { @Override public void onResponse(Response<Model> response, Retrofit retrofit) { //try this Call<Model> call = response.body(); // this is enough for retrieve model } @Override public void onFailure(Throwable t) { t.printStackTrace(); og.e("2.0 getFeed > onFailure => ", t.toString()); } }); 

Puede establecer el nivel de registro en su adaptador de retroadaptación como se muestra a continuación y ver la respuesta y otros datos como encabezado, código de respuesta vs.

 setLogLevel(LogLevel.FULL) 

Editar: Esto no funciona en Retrofit 2.0. Si está utilizando 1.9 puede utilizar.

  • Prueba de respuestas reales de red con retroadaptación
  • ¿Cómo hacer una solicitud de POST utilizando retrofit 2?
  • Observable.empty () hace que java.util.NoSuchElementException: Secuencia no contiene elementos
  • ¿Cómo llamo a una intención en Retrofit Callback?
  • Retrofit 2.0 java.lang.IllegalStateException: Se esperaba BEGIN_ARRAY pero era STRING
  • Autentificación JWT de la firma de la firma del decodin del error
  • Retrofit 2: enviar archivos con el objeto json
  • Cambiar ConnectionTimeout de Retrofit OkHttpClient en tiempo de ejecución
  • Uso de MultipartTypedOutput
  • OkHttp / tiempo de espera de retroactivación predeterminado
  • Cómo manejar Dynamic JSON en Retrofit?
  • Interesting Posts
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.