本文正在参加「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