美文网首页
okhttp3 添加日志拦截器

okhttp3 添加日志拦截器

作者: 好名字都已经让人起了 | 来源:发表于2018-03-09 17:32 被阅读250次

    最近在使用Retrofit时,因为想把请求报文与响应报文的具体内容打到Monitor中,以便于与服务器进行联调。现在进行总结一下


    1. 使用开源Log管理工具,在Studio中添加如下依赖。
    compile 'com.squareup.okhttp3:logging-interceptor:3.8.0'
    

    然后在网络基类中添加如下代码(前提是使用okhttp 或是 retrofit)

     // Log信息拦截器
     HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
     //设置日志打印级别
     loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
     //将拦截器添加到ok中
     builder.addInterceptor(loggingInterceptor);
    

    只需要这三行代码就可实现日志的打印。关于这种方式,经过测试会出现在有些手机上无法打印Log的情况,需要在手机的开发者应用中进行设置。关于打印的格式如果我们不重写的情况下格式是比较乱的,如果想对格式控制一下可以用如下方式

    //在HttpLoggingInterceptor的构造方法内传入一个Logger对象,并重写它的log方法
    HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
                            @Override
                            public void log(String message) {
                                //可在该方法中对message进行处理打印
                                Log.e(Tag,message)
                            }
                        });
    
    1. 第二中方法是可以自定义个拦截器。上代码
        /**
         * 日志拦截器
         */
        private static final Interceptor mLoggingInterceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                long t1 = System.nanoTime();//请求发起的时间
                Log.e("Interceptor", String.format("发送请求 %s on %s%n%s", request.url(), chain.connection(), request.headers()));
                Response response = chain.proceed(request);
                long t2 = System.nanoTime();//收到响应的时间
                //这里不能直接使用response.body().string()的方式输出日志
                //因为response.body().string()之后,response中的流会被关闭,程序会报错,我们需要创建出一个新的response给应用层处理
                ResponseBody responseBody = response.peekBody(1024 * 1024);
                printLog("接受响应", responseBody.string());
                return response;
            }
        };
    

    下面为printlog方法的代码

    /**
    *   三个参数 Tag就是log中的tag,msg为具体信息
    */
        public static void printLog(String tag, String msg) {
            String message = null;
            try {//需判断json是什么格式
                if (msg.startsWith("{")) {
                    JSONObject jsonObject = new JSONObject(msg);
                    message = jsonObject.toString(4);//最重要的方法,就一行,返回格式化的json字符串,其中的数字4是缩进字符数
                } else if (msg.startsWith("[")) {
                    JSONArray jsonArray = new JSONArray(msg);
                    message = jsonArray.toString(4);
                } else {
                    message = msg;
                }
            } catch (JSONException e) {
                message = msg;
            }
            String[] lines = message.split(LINE_SEPARATOR);
            //此处也可以画分割线
             //log.e(tag,"----------------------------------------------")
            for (String line : lines) {
                Log.d(tag, "|" + line);
            }
            //log.e(tag,"----------------------------------------------")
        }
    

    最后记的将自定义的Interceptor 添加到okhttp中,就可实现日志的打印。


    以上就是所知的两种方式,如有错误,请多多指正。

    相关文章

      网友评论

          本文标题:okhttp3 添加日志拦截器

          本文链接:https://www.haomeiwen.com/subject/afsyfftx.html