Saltar al contenido

¿Cómo registrar el cuerpo de solicitud y respuesta con Retrofit-Android?

Te damos la respuesta a este atolladero, al menos eso esperamos. Si sigues con alguna duda puedes dejar un comentario, que sin dudarlo te responderemos

Solución:

Modernización 2.0 :

ACTUALIZACIÓN: @ por Marcus Pöhls

Iniciar sesión en Retrofit 2

Retrofit 2 confía completamente en OkHttp para cualquier operación de red. Dado que OkHttp es una dependencia de pares de Retrofit 2, no necesitará agregar una dependencia adicional una vez que Retrofit 2 se lance como versión estable.

OkHttp 2.6.0 se envía con un interceptor de registro como dependencia interna y puede usarlo directamente para su cliente Retrofit. Retrofit 2.0.0-beta2 todavía usa OkHttp 2.5.0. Las versiones futuras aumentarán la dependencia a versiones superiores de OkHttp. Es por eso que necesita importar manualmente el interceptor de registro. Agregue la siguiente línea a sus importaciones de Gradle dentro de su archivo build.gradle para obtener la dependencia del interceptor de registro.

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

También puede visitar la página de GitHub de Square sobre este interceptor

Agregar registro a Retrofit 2

Mientras desarrolla su aplicación y para fines de depuración, es bueno tener una función de registro integrada para mostrar información de solicitud y respuesta. Dado que el registro ya no está integrado de forma predeterminada en Retrofit 2, necesitamos agregar un interceptor de registro para OkHttp. Afortunadamente, OkHttp ya se envía con este interceptor y solo necesita activarlo para su OkHttpClient.

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();  
// set your desired log level
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();   
// add your other interceptors …
// add logging as last interceptor
httpClient.addInterceptor(logging);  // <-- this is the important line!
Retrofit retrofit = new Retrofit.Builder()  
        .baseUrl(API_BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .client(httpClient.build())
        .build();

Recomendamos agregar el registro como último interceptor, porque esto también registrará la información que agregó con los interceptores anteriores a su solicitud.

Niveles de registro

Registrar demasiada información hará explotar su monitor de Android, por eso el interceptor de registro de OkHttp tiene cuatro niveles de registro: NINGUNO, BÁSICO, ENCABEZADOS, CUERPO. Lo guiaremos a través de cada uno de los niveles de registro y describiremos su salida.

Para obtener más información, visite: Retrofit 2 - Log Requests and Responses

ANTIGUA RESPUESTA:

ya no hay que iniciar sesión en Retrofit 2. El equipo de desarrollo eliminó la función de registro. Para ser honesto, la función de registro no era tan confiable de todos modos. Jake Wharton declaró explícitamente que los mensajes u objetos registrados son los valores asumidos y no se puede probar que sean true. La solicitud real que llega al servidor puede tener un cuerpo de solicitud modificado o algo más.

Aunque no hay un registro integrado de forma predeterminada, puede aprovechar cualquier registrador de Java y usarlo dentro de un interceptor OkHttp personalizado.

Para obtener más información sobre Retrofit 2, consulte: Retrofit - Getting Started and Create an Android Client

solía setLogLevel(LogLevel.FULL).setLog(new AndroidLog("YOUR_LOG_TAG")), Me ayudó.
ACTUALIZAR.
También puede probar el uso con fines de depuración retrofit.client.Response como modelo de respuesta

Actualización para Retrofit 2.0.0-beta3

Ahora tienes que usar okhttp3 con el constructor. Además, el interceptor antiguo no funcionará. Esta respuesta está diseñada para Android.

Aquí tienes una copia rápida y pegada con las novedades.

1. Modifica tu archivo gradle a

  compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3'
  compile "com.squareup.retrofit2:converter-gson:2.0.0-beta3"
  compile "com.squareup.retrofit2:adapter-rxjava:2.0.0-beta3"
  compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'

2. Verifique este código de muestra:

con las nuevas importaciones. Puede eliminar Rx si no lo usa, también eliminar lo que no usa.

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.GsonConverterFactory;
import retrofit2.Retrofit;
import retrofit2.RxJavaCallAdapterFactory;
import retrofit2.http.GET;
import retrofit2.http.Query;
import rx.Observable;

public interface APIService 

  String ENDPOINT = "http://api.openweathermap.org";
  String API_KEY = "2de143494c0b2xxxx0e0";

  @GET("/data/2.5/weather?appid=" + API_KEY) Observable getWeatherForLatLon(@Query("lat") double lat, @Query("lng") double lng, @Query("units") String units);


  class Factory 

    public static APIService create(Context context) 

      OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
      builder.readTimeout(10, TimeUnit.SECONDS);
      builder.connectTimeout(5, TimeUnit.SECONDS);

      if (BuildConfig.DEBUG) 
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
        builder.addInterceptor(interceptor);
      

      //Extra Headers

      //builder.addNetworkInterceptor().add(chain -> 
      //  Request request = chain.request().newBuilder().addHeader("Authorization", authToken).build();
      //  return chain.proceed(request);
      //);

      builder.addInterceptor(new UnauthorisedInterceptor(context));
      OkHttpClient client = builder.build();

      Retrofit retrofit =
          new Retrofit.Builder().baseUrl(APIService.ENDPOINT).client(client).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();

      return retrofit.create(APIService.class);
    
  

Prima

Sé que es fuera de tema pero lo encuentro genial.

En caso de que haya un código de error http de no autorizado, aquí hay un interceptor. Utilizo eventbus para transmitir el evento.

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import com.androidadvance.ultimateandroidtemplaterx.BaseApplication;
import com.androidadvance.ultimateandroidtemplaterx.events.AuthenticationErrorEvent;

import de.greenrobot.event.EventBus;
import java.io.IOException;
import javax.inject.Inject;
import okhttp3.Interceptor;
import okhttp3.Response;

public class UnauthorisedInterceptor implements Interceptor 

  @Inject EventBus eventBus;

  public UnauthorisedInterceptor(Context context) 
    BaseApplication.get(context).getApplicationComponent().inject(this);
  

  @Override public Response intercept(Chain chain) throws IOException 
    Response response = chain.proceed(chain.request());
    if (response.code() == 401) 
      new Handler(Looper.getMainLooper()).post(() -> eventBus.post(new AuthenticationErrorEvent()));
    
    return response;
  

código tomado de https://github.com/AndreiD/UltimateAndroidTemplateRx (mi proyecto).

Sección de Reseñas y Valoraciones

Tienes la opción de añadir valor a nuestro contenido informacional tributando tu experiencia en los comentarios.

¡Haz clic para puntuar esta entrada!
(Votos: 3 Promedio: 4)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *