Logging with Retrofit 2

前端 未结 21 1325
春和景丽
春和景丽 2020-11-22 07:33

I\'m trying to get the exact JSON that is being sent in the request. Here is my code:

OkHttpClient client = new OkHt         


        
相关标签:
21条回答
  • 2020-11-22 07:52

    If you are using Retrofit2 and okhttp3 then you need to know that Interceptor works by queue. So add loggingInterceptor at the end, after your other Interceptors:

    HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
            if (BuildConfig.DEBUG)
                loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
    
     new OkHttpClient.Builder()
                    .connectTimeout(60, TimeUnit.SECONDS)
                    .readTimeout(60, TimeUnit.SECONDS)
                    .writeTimeout(60, TimeUnit.SECONDS)
                    .addInterceptor(new CatalogInterceptor(context))//first
                    .addInterceptor(new OAuthInterceptor(context))//second
                    .authenticator(new BearerTokenAuthenticator(context))
                    .addInterceptor(loggingInterceptor)//third, log at the end
                    .build();
    
    0 讨论(0)
  • 2020-11-22 07:53

    A best way to do this right in Retrofit 2 is to add the logger interceptor as a networkInterceptor this will print out the network headers and your custom headers too. The important thing is to remember that interceptor work as a stack and be sure u add the logger at the end of all.

    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    builder.addInterceptor(new MyCustomInterceptor());
    builder.connectTimeout(60, TimeUnit.SECONDS);
    builder.readTimeout(60, TimeUnit.SECONDS);
    builder.writeTimeout(60, TimeUnit.SECONDS);
    // important line here
    builder.addNetworkInterceptor(LoggerInterceptor());
    
    0 讨论(0)
  • 2020-11-22 07:56

    I met the thing as you and I tried to ask the author of the book Retrofit: Love working with APIs on Android (here is the link) (nope! I am not making some ads for them....but they are really nice guys :) And the author replied to me very soon, with both Log method on Retrofit 1.9 and Retrofit 2.0-beta.

    And here is the code of Retrofit 2.0-beta:

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

    This is how to add logging method with the help of HttpLoggingInterceptor. Also if you are the reader of that book I mentioned above, you may find that it says there is not log method with Retrofit 2.0 anymore -- which, I had asked the author, is not correct and they will update the book next year talking about it.

    // In case you are not that familiar with the Log method in Retrofit, I would like to share something more.

    Also should be noticed that there are some Logging Levels you could pick. I use the Level.BODY most of the time, which will give some thing like this:

    You can find almost all the http staff inside the picture: the header, the content and response, etc.

    And sometimes you really don't need all the guests to attend your party: I just want to know whether it's successfully connected, that internet call is successfully made within my Activiy & Fragmetn. Then you are free to use Level.BASIC, which will return something like this:

    Can you find the status code 200 OK inside? That is it :)

    Also there is another one, Level.HEADERS, which will only return the header of the network. Ya of course another picture here:

    That's all of the Logging trick ;)

    And I would like to share you with the tutorial I learned a lot there. They have a bunch of great post talking about almost everything related to Retrofit, and they are continuing updating the post, at the same time Retrofit 2.0 is coming. Please take a look at those work, which I think will save you lots of time.

    0 讨论(0)
  • 2020-11-22 07:56

    Retrofit's interceptor is a great feature which allow you work with http requests. There are two types of them: application and network interceptors.

    I would recommend to use Charles Web Debugging Proxy Application if you need logging your requests/responses. The output is very similar to Stetho but it is more powerful instrument which you do not need to add as a dependency to an application

    0 讨论(0)
  • 2020-11-22 07:58

    I don't know if setLogLevel() will return in the final 2.0 version of Retrofit but for now you can use an interceptor for logging.

    A good example can found in OkHttp wiki: https://github.com/square/okhttp/wiki/Interceptors

    OkHttpClient client = new OkHttpClient();
    client.interceptors().add(new LoggingInterceptor());
    
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://www.yourjsonapi.com")
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build();
    
    0 讨论(0)
  • 2020-11-22 08:00

    In Retrofit 2 you should use HttpLoggingInterceptor.

    Add dependency to build.gradle. Latest version as of October 2019 is:

    implementation 'com.squareup.okhttp3:logging-interceptor:4.2.1'
    

    Create a Retrofit object like the following:

    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
    
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://backend.example.com")
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    
    return retrofit.create(ApiClient.class);
    

    In case of deprecation warnings, simply change setLevel to:

    interceptor.level(HttpLoggingInterceptor.Level.BODY);
    

    The above solution gives you logcat messages very similar to the old ones set by

    setLogLevel(RestAdapter.LogLevel.FULL)
    

    In case of java.lang.ClassNotFoundException:

    Older Retrofit version might require an older logging-interceptor version. Take a look at comments sections for details.

    0 讨论(0)
提交回复
热议问题