How to log request and response body with Retrofit-Android?

前端 未结 9 2067
盖世英雄少女心
盖世英雄少女心 2020-11-28 21:35

I can\'t find relevant methods in the Retrofit API for logging complete request/response bodies. I was expecting some help in the Profiler (but it only offers meta-data abou

9条回答
  •  栀梦
    栀梦 (楼主)
    2020-11-28 21:58

    Update for Retrofit 2.0.0-beta3

    Now you have to use okhttp3 with builder. Also the old interceptor will not work. This response is tailored for Android.

    Here's a quick copy paste for you with the new stuff.

    1. Modify your gradle file to

      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. Check this sample code:

    with the new imports. You can remove Rx if you don't use it, also remove what you don't use.

    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);
        }
      }
    }
    

    Bonus

    I know it's offtopic but I find it cool.

    In case there's an http error code of unauthorized, here is an interceptor. I use eventbus for transmitting the event.

    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;
      }
    }
    

    code take from https://github.com/AndreiD/UltimateAndroidTemplateRx (my project).

提交回复
热议问题