开源项⽬——让okhttp3优雅地打印⽇志
现在应该有许多⼈都是使⽤okhttp来作为项⽬的⽹络请求的底层库,那么,还有⼈在沿⽤着对每个请求在执⾏前后⼿动打印⼀下参数及地址这种古⽼的⽇志打印⽅式吗?okhttp的灵活⽽强⼤的特点之⼀,就是其提供了⼀个接⼝,使得我们在打印⽇志时极为⽅便,并且对我们的接⼝代码⽆⼊侵性。
本篇⽂章介绍⼀个okhttp3的⽇志打印库,⽆论是使⽤古⽼⽅式来打印⽇志的,还是使⽤square官⽅okhttp3的⽇志库的,都可以⼀看。
okhttp3-loginterceptor是⽤于okhttp3的⼀个⽇志打印库,⼩巧轻量,相⽐square提供的okhttp3的logging-interceptor,它对每个请求和响应都进⾏编号 ,并且对于json的请求或响应内容,还将打印出格式化的JSON内容,⽽除了依赖okhttp3之外,它不会添加任何其他第三⽅依赖。那么它是如何⼩巧轻量⽽⼜不会向项⽬引⼊其他依赖的呢?等下我们在⽂中会提到,下⾯先开始介绍它的使⽤。
快速⼊门
声明依赖
添加依赖,以下的latest.integration建议换为当前最新版本的具体版本号。
compile 'com.parkingwang:okhttp3-loginterceptor:latest.integration'
添加代码
然后在创建OkHttpClient对象的代码中添加其实例,代码如下:
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new LogInterceptor()).build();
这样就完成了。然后你就可以看到类似这样的⽇志了:
W/OkHttp: [4 request]--> GET api.github/users/defunkt http/1.1
phpjson格式化输出W/OkHttp: [4 request]--> END GET
W/OkHttp: [5 request]--> GET api.github/zen http/1.1
W/OkHttp: [5 request]--> END GET
W/OkHttp: [6 request]--> GET api.github/users/msdx http/1.1
W/OkHttp: [6 request]--> END GET
W/OkHttp: [4 response]<-- 200 OK api.github/users/defunkt (1335ms)
W/OkHttp: [4 response]Server: GitHub
W/OkHttp: [4 response]Date: Thu, 12 Jan 2017 04:01:43 GMT
W/OkHttp: [4 response]Content-Type: application/json; charset=utf-8
W/OkHttp: [4 response]Transfer-Encoding: chunked
⽂章这就结束了?当然不,既然是专门介绍的⽂章当然得好好写写。
详细介绍
适当地添加⽇志
⾸先,我们打印⽇志⼀般都是在debug的时候才需要,对于release即发布出去的版本,是不需要打印请求的⽇志的,所以通常我们会这样写代码:
final OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
if (BuildConfig.DEBUG) {
clientBuilder.addInterceptor(new LogInterceptor());
}
return clientBuilder
//.XXX 省略⼀⼤堆设置其他参数的代码
.build();
关于JSON格式化输出
前⾯提到,okhttp3-loginterceptor除了okhttp3之外,不会向项⽬添加其他第三⽅依赖,尽量做到⼩巧轻量。所以当判断请求或响应的contentType的内容为JSON数据⽽尝试格式化输出JSON内容时,是采⽤反射的⽅式。在第⼀次调⽤JSON格式化的时候,会判断当前使⽤的是哪⼀个JSON解析库,然后调⽤其相关⽅法来格式化JSON。⽬前⽀持常⽤的JSON解析库,包括:gson, fastjson, moshi,
org.json。当你的项⽬不包含以上这些库时,则不会进⾏格式化的JSON数据输出。
混淆规则
okhttp3-loginterceptor由于使⽤反射来调⽤前⾯所提到的json解析库,⽽本⾝并没有对它们声明依赖。所以需要添加以下的混淆规则:-dontwarn com.parkingwang.okhttp3.LogInterceptor.formatter.*
最后
okhttp3-loginterceptor是我基于需要的功能,参考okhttp3-logging-interceptor的代码⽽封装的⼀个库。
⾸先,我们与服务器的数据交互使⽤json⽅式⽐较多,在开发或调试时需要更能直观地查看json数据,所以我封装了格式化输出json数据的功能。
其次,在应⽤中,经常是多个请求同时进⾏。通过⽇志中的线程名来判断哪⼀⾏是属于哪个响应,对应于哪个请求相当不便,所以我在每⼀⾏添加了⼀个前缀,也是为了更直观地查看⽇志。
我设想的是让它只做最需要的事,所以没添加也没打算添加其他⼀些⽇志库的酷炫输出⽇志格式的功能。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。