使用 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() ,我应该如何进行正确的日志记录?

原文由 Gabor 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 689
2 个回答

在 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 版本。查看评论部分以了解详细信息。

原文由 klimat 发布,翻译遵循 CC BY-SA 4.0 许可协议

我遇到了你,我想问一下 Retrofit 这本书的作者:喜欢在 Android 上使用 API (这里是 链接)(不!我不是在为他们做广告……但他们真的很好伙计们 :) 作者很快回复了我,在 Retrofit 1.9 和 Retrofit 2.0-beta 上都有 Log 方法。

这是 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();

这是如何在 HttpLoggingInterceptor 的帮助下添加日志记录方法。另外,如果你是我上面提到的那本书的读者,你可能会发现它说 Retrofit 2.0 不再有日志方法——我问过作者,这是不正确的,他们会在明年更新这本书关于它。

// 如果你对 Retrofit 中的 Log 方法不是很熟悉,我想再分享一些东西。

还应该注意的是,您可以选择一些日志记录级别。我大部分时间都使用 Level.BODY ,它会给出如下内容:

在此处输入图像描述

你可以在图中找到几乎所有的http工作人员:header、content和response等。

有时你真的不需要所有客人来参加你的聚会:我只想知道它是否已成功连接,是否在我的 Activiy & Fragmetn 中成功拨打了互联网电话。然后你可以自由使用 Level.BASIC ,它将返回如下内容:

在此处输入图像描述

你能找到里面的状态码 200 OK 吗?这就对了 :)

还有另一个 Level.HEADERS ,它只会返回网络的标头。当然,这里还有另一张照片:

在此处输入图像描述

这就是所有的日志记录技巧;)

我想与您分享我在 那里 学到的很多教程。他们有很多很棒的帖子,几乎讨论了与 Retrofit 相关的所有内容,并且他们正在继续更新帖子,同时 Retrofit 2.0 即将到来。请看一下这些工作,我认为这会为您节省很多时间。

原文由 Anthonyeef 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题