OKhttp3拦截器的理解与使用

要知道,在实际的项目中,与各个系统之间的接口调用是我们经常会用到的,为了方便以后查看接口之间传输的数据是否正确(说白了就是要把不是自己系统的问题甩出去----甩锅!),我们要搭建自己系统内部的日志,在查找自己问题的同时也方便对外甩锅!

好像有点跑题了~~

言归正传,一般情况下我们在系统输出日志的时候都是打印在文件中,这里我们先介绍一下logback.xml日志的配置:
<configuration scan="true" scanPeriod="3 seconds">
    <!-- 请求输出日志的策略 -->
    <appender name="REST-OUTBOUND" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <!-- 匹配信息 -->
            <pattern>%msg%n</pattern>
        </encoder>
        <!-- 将文件输出到指定的路径 -->
        <file>/data/api_logs/map/rest.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/data/api_logs/map/%d{yyyy-MM}/rest-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!-- 最大保存20天 -->
            <MaxHistory>20</MaxHistory>
        </rollingPolicy>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>5MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!-- 需要拦截的类路径“com.xxx.xxx.xxx.log.LogInterceptor”,并指定输出的样式:REST-OUTBOUND -->
    <logger name="com.xxx.xxx.xxx.log.LogInterceptor" level="INFO" additivity="false">
        <appender-ref ref= "REST-OUTBOUND"/>
    </logger>
<configuration/>

上图很简单,意思就是要将LogInterceptor类中打印的日志输出到指定的目录文件

试想,如果我们将每次请求的日志都放在文件中,会造成查找时很不便捷,并且文件会越来越大,时间久了会直逼服务器的硬盘容量,等到那个时候再不得已的情况下将文件清空。如果我们线上有一个问题是几个月之前的数据造成的,那么在找那个时候的日志去锁定问题基本很将bug复现。

如果我们要将每一个请求信息打印在日志的文件的同时还需要持久化到数据库中,该如何做呢?

简单来说我们需要将每次发送请求的地方加入日志实体类的各种set方法,然后保存到数据库。这样是可以实现功能,但是会造成项目中大量的冗余代码!如果哪天日志实体类中要新加一个字段,那么灾难就来了,我们需要修改所相关的java文件,都要加入这个字段,从而失去了项目的高可维护性!!!

所以下面我们要讲的重头戏来了,利用拦截器的方式:

首先,我们需要实现一个okhttp3包下的拦截器,在进行每一次http请求时被拦截,指定拦截器要做什么

这里我们需要拦截器拦截请求http请求和响应信息保存到我们需要持久化的实体类中。

public class LogInterceptor implements Interceptor {

    //保存日志对象的的service
    private IHttpRequestLogService logService;

    @Override
    public Response intercept(Chain chain) throws IOException {
        //获得请求的request信息
        Request req = chain.request();

        //处理请求信息

        //将请求信息保存到我们将来要持久化的日志对象中,例如:
        HttpRequestLog vo = new HttpRequestLog()
        vo.setMethod(req.method());
        vo.setRequestHeader(headersToString(req.headers()));

        //获得响应的的response信息并处理
        //执行这次请求,并经过拦截器返回结果响应结果
        Response resp = chain.proceed(req);
        vo.setStatusCode(resp.code());
        vo.setResponseHeader(headersToString(resp.headers()));
        //在日志总打印请求和响应结构体
        logger.info(JSON.toJsonString(vo));
        //在打印日志对象的同时,将对象持久化到数据库
        logService.log(vo);
        //将最终结果返回到客户端调用方
        return resp;
    }
}

我们需要实例化一个OkHttpClient实例,在httpclient实例添加拦截器

public void init() {
        client = new OkHttpClient.Builder()
                .addInterceptor(new LogInterceptor(logService))//添加拦截器
                .readTimeout(300, TimeUnit.SECONDS)//设置读取超时时间
                .writeTimeout(300, TimeUnit.SECONDS)//设置写的超时时间
                .connectTimeout(5, TimeUnit.SECONDS)//设置连接超时时间
                .build();
    }

配置完上述操作,在通过client.post()(或者其他请求方式)都会经过拦截器LogInterceptor进行拦截,最后再返回结果到客户端。
这样我们不但可以将打印信息打印到指定的日志文件,还可以在拦截器中处理需要保存的日志信息。

欢迎小伙们进行评论,也希望指出文中的错误,咱们一起沟通一起学习~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,183评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,850评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,766评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,854评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,871评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,457评论 1 311
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,999评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,914评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,465评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,543评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,675评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,354评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,029评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,514评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,616评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,091评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,685评论 2 360

推荐阅读更多精彩内容