在移动端开发时,我们常常需要像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.这样在网络请求中能打印如下日志:
打印请求相关信息:
打印响应相关信息:
完美!