2.9 Retrofit 2的日志使用问题| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>

提问: Retrofit 2的日志使用问题

我正在尝试获取在请求中发送的JSON。这是我的代码:

OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor(){
   @Override public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
      Request request = chain.request();
      Log.e(String.format("\nrequest:\n%s\nheaders:\n%s",
                          request.body().toString(), request.headers()));
      com.squareup.okhttp.Response response = chain.proceed(request);
      return response;
   }
});
Retrofit retrofit = new Retrofit.Builder()
   .baseUrl(API_URL)
   .addConverterFactory(GsonConverterFactory.create())
   .client(client).build();
复制代码

但是我只能在日志中看到:

request:
com.squareup.okhttp.RequestBody$1@3ff4074d
headers:
Content-Type: application/vnd.ll.event.list+json
复制代码

考虑到Retrofit 1的删除了setLog()和setLogLevel()的使用,我应该如何做正确的日志记录?

回答1:

在Retrofit 2中,您应该使用HttpLoggingInterceptor。

将依赖项添加到build.gradle。截至2019年10月的最新版本是:

implementation ‘com.squareup.okhttp3:logging-interceptor:4.2.1’

创建一个Retrofit的对象,如下所示:

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);
复制代码

如果有方法弃用警告,就更改setLevel为:

interceptor.level(HttpLoggingInterceptor.Level.BODY);
复制代码

上面的解决方案为您提供了与就的那个非常相似的logcat消息。


setLogLevel(RestAdapter.LogLevel.FULL)
复制代码

如果出现java.lang.ClassNotFoundException的问题,较旧的Retrofit 版本可能需要较旧的logging-interceptor版本。

回答2:
这是一个Interceptor同时记录请求和响应正文(使用Timber,基于OkHttp文档中的示例以及其他一些StackOverflow答案)的实现:

public class TimberLoggingInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();

        long t1 = System.nanoTime();
        Timber.i("Sending request %s on %s%n%s", request.url(), chain.connection(), request.headers());
        Timber.v("REQUEST BODY BEGIN\n%s\nREQUEST BODY END", bodyToString(request));

        Response response = chain.proceed(request);

        ResponseBody responseBody = response.body();
        String responseBodyString = response.body().string();

        // now we have extracted the response body but in the process
        // we have consumed the original reponse and can't read it again
        // so we need to build a new one to return from this method

        Response newResponse = response.newBuilder().body(ResponseBody.create(responseBody.contentType(), responseBodyString.getBytes())).build();

        long t2 = System.nanoTime();
        Timber.i("Received response for %s in %.1fms%n%s", response.request().url(), (t2 - t1) / 1e6d, response.headers());
        Timber.v("RESPONSE BODY BEGIN:\n%s\nRESPONSE BODY END", responseBodyString);

        return newResponse;
    }

    private 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";
        }
    }
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享