带改造的日志记录 2

2022-08-31 04:49:36

我正在尝试获取请求中发送的确切 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

我应该如何进行正确的日志记录,因为删除了我们曾经在改造1中使用的日志记录?setLog()setLogLevel()


答案 1

在改造2中,您应该使用HttpLoggingInterceptor

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

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的情况下

较旧的改造版本可能需要较旧的版本。请查看评论部分了解详细信息。logging-interceptor


答案 2

当你和我试图问这本书的作者时,我遇到了这件事:喜欢在Android上使用API(这是链接)(不!我不是在为他们做一些广告....但他们真的是好人:)作者很快就回复了我,在改造1.9和改造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的帮助下添加日志记录方法。另外,如果你是我上面提到的那本书的读者,你可能会发现它说改造2.0不再有日志方法了 - 我问过作者,这是不正确的,他们将在明年更新这本书。

如果您不熟悉改造中的Log方法,我想分享更多内容。

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

enter image description here

您可以在图片中找到几乎所有的http员工:标题,内容和响应等。

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

enter image description here

你能在里面找到状态代码200 OK吗?这就是:)

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

enter image description here

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

我想和你分享我在那里学到了很多东西的教程。他们有一堆很棒的帖子,谈论几乎所有与改造有关的内容,他们正在继续更新帖子,同时改造2.0即将到来。请看一下这些工作,我认为这将为您节省大量时间。


推荐