文档章节

OkHttp Log Interceptor

Turman
 Turman
发布于 2016/06/29 11:58
字数 452
阅读 348
收藏 0

retrofit2经常会有gson解析错误,通过输出response body可以很好的查看gson entity定义的错误。

        Interceptor loggingInterceptor = chain -> {
            Request request = chain.request();
            long t1 = System.nanoTime();
            Response response = chain.proceed(request);
            long t2 = System.nanoTime();

            double time = (t2 - t1) / 1e6d;

            if (request.method().equals("GET")) {
                Log.i("Turman","GET\n" + "url->"+request.url()+"\ntime->"+time+"\nheaders->"+request.headers()+"\nresponse code->"+response.code()+"\nresponse headers->"+response.headers()+"\nbody->"+response.body().string());
            } else if (request.method().equals("POST")) {
                Log.i("Turman","POST" + "url->"+request.url()+"\ntime->"+time+"\nheaders->"+request.headers()+"\nresponse code->"+response.code()+"\nresponse headers->"+response.headers()+"\nbody->"+response.body().string());
            } else if (request.method().equals("PUT")) {
                Log.i("Turman","PUT" + "url->"+request.url()+"\ntime->"+time+"\nheaders->"+request.headers()+"\nresponse code->"+response.code()+"\nresponse headers->"+response.headers()+"\nbody->"+response.body().string());
            } else if (request.method().equals("DELETE")) {
                Log.i("Turman","DELETE" + "url->"+request.url()+"\ntime->"+time+"\nheaders->"+request.headers()+"\nresponse code->"+response.code()+"\nresponse headers->"+response.headers()+"\nbody->"+response.body().string());
            }

            return chain.proceed(request);
        };

OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(20,TimeUnit.SECONDS)
                .readTimeout(30,TimeUnit.SECONDS)
                .addInterceptor(loggingInterceptor)
                .build();


Demo:

public class NetWorkManager {

    private static final int RONG_CLOUD_HEAD = 0;
    private static final int COMMON_HEAD = 1;

    private static Retrofit commonClient = null;
    private static Retrofit rongClouldClient = null;

    private NetWorkManager(){}

    public static Retrofit getCommonClient(){
        if (commonClient == null) {
            commonClient = new Retrofit.Builder()
                    .baseUrl(NetContents.BASE_HOST)
                    .client(getHttpClient(COMMON_HEAD))
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return commonClient;
    }

    public static Retrofit getRongCloudClient(){


        if (rongClouldClient == null) {
            rongClouldClient = new Retrofit.Builder()
                    .baseUrl(NetContents.RONG_CLOUD_HOST)
                    .client(getHttpClient(RONG_CLOUD_HEAD))
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return rongClouldClient;
    }

    public static OkHttpClient getHttpClient(final int headType){
        //okhttp log intercepter
        Interceptor okhttpLogInterceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();

                //add headers
                request = addHeaders(headType, request);

                if (BuildConfig.DEBUG) {
                    long t1 = System.nanoTime();
                    Response response = chain.proceed(request);
                    long t2 = System.nanoTime();

                    double time = (t2 - t1) / 1e6d;

                    String msg = "%s\nurl->" + request.url()
                            + "\ntime->" + time
                            + "ms\nheaders->" + request.headers()
                            + "\nresponse code->" + response.code()
                            + "\nresponse headers->" + response.headers()
                            + "\nbody->" + response.body().string();

                    if (request.method().equals("GET")) {
                        Logger.i(msg, "GET");
                    } else if (request.method().equals("POST")) {
                        Request copyRequest = request.newBuilder().build();
                        if (copyRequest.body() instanceof FormBody) {
                            Buffer buffer = new Buffer();
                            copyRequest.body().writeTo(buffer);
                            Logger.i("request params:" + buffer.readUtf8());
                        }
                        Logger.i(msg, "POST");
                    } else if (request.method().equals("PUT")) {
                        Logger.i(msg, "PUT");
                    } else if (request.method().equals("DELETE")) {
                        Logger.i(msg, "DELETE");
                    }
                }
                return chain.proceed(request);
            }
        };

        return new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(20, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS)
                .addInterceptor(okhttpLogInterceptor)
                .build();
    }

    /**
     * 添加请求头
     * @param type 区分不同的API
     * @param request
     * @return
     */
    private static Request addHeaders(int type, Request request){
        Request.Builder requestBuild = request.newBuilder();
        switch (type) {
            case RONG_CLOUD_HEAD:
                String nonce = (int)(Math.random()*1000000000)+"";
                String timestamp = System.currentTimeMillis()+"";
                String signature = SHA1.encode(BuildConfig.RONG_CLOUD_SECRET+nonce+timestamp);
                requestBuild.addHeader("App-Key",BuildConfig.RONG_CLOUD_KEY)
                        .addHeader("Nonce",nonce)
                        .addHeader("Timestamp",timestamp)
                        .addHeader("Signature",signature);
                break;
        }

        return requestBuild.build();
    }

}


这里注意过滤器返回值,直接返回response报错。

© 著作权归作者所有

Turman
粉丝 6
博文 36
码字总数 19221
作品 0
杨浦
程序员
私信 提问
加载中

评论(3)

A
Aitsuki

引用来自“Aitsuki”的评论

你这个相当于请求了两次网络。
报错是因为response.body只能获取一次,获取之后就会清空。
你如果想打印response.body 可以通过response.peekBody查看

引用来自“Turman”的评论

为什么是两次请求?peekBody调用的也是body里面的内容啊?能不能给个例子啊?
不常上开源中国……
chain.process就是请求网络了。你这调了两次不就是请求了两次么。
okhttp的response的body只能获取一次,然后第二次获取会为null,我也不知道为什么。
所以你这里可以用peekbody
Turman
Turman 博主

引用来自“Aitsuki”的评论

你这个相当于请求了两次网络。
报错是因为response.body只能获取一次,获取之后就会清空。
你如果想打印response.body 可以通过response.peekBody查看
为什么是两次请求?peekBody调用的也是body里面的内容啊?能不能给个例子啊?
A
Aitsuki
你这个相当于请求了两次网络。
报错是因为response.body只能获取一次,获取之后就会清空。
你如果想打印response.body 可以通过response.peekBody查看
OkHttp 3.x 源码解析之Interceptor 拦截器

Tamic / 开发者技术前线 OkHttp拦截器原理解析 在进行下文前,先说明一点,本文面向的是对Okhttp有一定基础的读者,Okhttp基础使用请阅读我的其他OKhttp+Retrofit+RxJava基础用法的文章: OK...

2018/10/28
0
0
OkHttp 3.10.0 发布,轻量的 Java 网络请求框架

OkHttp 3.10.0 发布了,OkHttp 是一个轻量的 Java 网络请求框架。本次更新内容如下: New: percent-escapes more characters. Previously several ASCII punctuation characters were not p......

淡漠悠然
2018/02/26
3.1K
5
Android面试的那些答不上来的问题(一)--- OkHttp的拦截器你到底了解多少(上)

前言 前段时间面试了很多家公司(坐标成都,大大小小加起来得20家吧),有时候有些事做多了,你就会发现它的一些窍门或者规律,面试这件事当然也不例外。其实很多公司问到的问题都大同小异,...

SillyMonkey
2018/05/10
0
0
OkHttp 3.11.0 发布,轻量的 Java 网络请求框架

OkHttp 3.11.0 已发布,OkHttp 是一个轻量的 Java 网络请求框架。 本次更新内容如下: OkHttp's new okhttp-tls submodule tames HTTPS and TLS. OkHttp now supports prior knowledge clear......

淡漠悠然
2018/07/15
1K
3
spring注解配置okhttp3

背景 之前在spring上面使用过okhttp:spring传统xml配置okhttp3 Component 运行时配置中心,现在还玩不6。 Controller 在控制器中使用: 参考 spring传统xml配置okhttp3 okhttp-logging-inte...

亚林瓜子
2018/12/09
219
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.3K
15
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
39
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部