Retrofit2如何优雅地打印网络请求的报文日志

在移动端开发时,我们常常需要像web端一样可以方便地查看我们向服务器发送请求的报文详细日志(如请求地址,请求参数,请求类型,服务器响应的耗时时间,请求返回的结果等等)。

使用Retrofit2时,如果我们需要打印上述的网络请求的日志,可以采用日志拦截器的方案得以实现。

1.导入网络库和日志库

我这里采用的是Rxjava +Retrofit

compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
compile('com.github.ihsanbal:LoggingInterceptor:2.0.5') {
    exclude group: 'org.json', module: 'json'
}

(注意:如果采用的是okhttp官方的com.squareup.okhttp3:logging-interceptor日志库,可能会遇到以下两个问题:部分机型无法正常打印网络日志;当两个api调用时间非常接近是,两个请求的打印日志会混乱,并且当返回数据过多时,日志打印不完整)

2. 关键代码如下:

OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
httpClientBuilder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
//add log record
if (BuildConfig.DEBUG) {
//打印网络请求日志
LoggingInterceptor httpLoggingInterceptor = new LoggingInterceptor.Builder()
         .loggable(BuildConfig.DEBUG)
         .setLevel(Level.BASIC)
         .log(Platform.INFO)
         .request("Request")
         .response("Response")
         .build();
httpClientBuilder.addInterceptor(httpLoggingInterceptor);
}

httpClientBuilder.addInterceptor(chain -> addAuthIntercepter(chain)); //添加认证authIntercepter,验证调用者身份信息
Retrofit retrofit = new Retrofit.Builder()
         .client(httpClientBuilder.build())
         .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm").create()))
         .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
         .baseUrl(BASE_URL)
         .build();
IApiService mApiService = retrofit.create(IApiService.class);

3.这样在网络请求中能打印如下日志:

打印请求相关信息:

Retrofit2如何优雅地打印网络请求的报文日志_第1张图片

打印响应相关信息:

Retrofit2如何优雅地打印网络请求的报文日志_第2张图片

完美!

你可能感兴趣的:(Android)