我试图获得在请求中发送的确切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
我应该如何做正确的日志记录,给定的删除setLog()和setLogLevel(),我们用来使用的Retrofit 1?
在Retrofit 2中做到这一点的最好方法是添加记录器拦截器作为networkInterceptor,这将打印出网络头和您的自定义头。重要的是要记住,拦截器作为一个堆栈工作,并确保在所有的末尾添加记录器。
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());
当你和我试图问《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方法,我想分享更多的东西。
还应该注意,您可以选择一些日志级别。我使用关卡。BODY,它会给出这样的东西:
你可以在图片中找到几乎所有的http人员:头,内容和响应,等等。
有时候你真的不需要所有的客人都来参加你的派对:我只想知道它是否成功连接,在我的activity & Fragmetn中是否成功拨打互联网电话。然后你就可以自由使用Level了。BASIC,它将返回类似这样的东西:
你能找到里面的状态码200 OK吗?就是这样:)
还有一个,Level。HEADERS,它只返回网络的头信息。当然,这是另一张图:
这就是所有的日志技巧;)
我想和你们分享我在那里学到了很多的教程。他们有一堆很棒的帖子,谈论几乎所有与改造有关的事情,他们还在继续更新帖子,与此同时,改造2.0即将到来。请看一下这些工作,我想这会节省你很多时间。
在改装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版本可能需要旧的日志拦截器版本。详情请看评论部分。