retrofit2.0 OkHttpClient--拦截器

  • retryOnConnectionFailure:错误重联
  • addInterceptor:设置应用拦截器,可用于设置公共参数,头信息,日志拦截等
  • addNetworkInterceptor:网络拦截器,可以用于重试或重写,对应与1.9中的se
    tRequestInterceptor。
  • 应用拦截器:
    1. 不需要担心中间过程的响应,如重定向和重试.
    2. 总是只调用一次,即使HTTP响应是从缓存中获取.
    3. 观察应用程序的初衷. 不关心OkHttp注入的头信息如: If-None-Match.
    4. 允许短路而不调用 Chain.proceed(),即中止调用.
    5. 允许重试,使 Chain.proceed()调用多次.

  • 网络拦截器
    1. 能够操作中间过程的响应,如重定向和重试.
    2. 当网络短路而返回缓存响应时不被调用.
    3. 只观察在网络上传输的数据.
    4. 携带请求来访问连接.

参考:Interceptors
中文翻译:Okhttp-wiki 之 Interceptors 拦截器

class LoggingInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        //这个chain里面包含了request和response,所以你要什么都可以从这里拿
        Request request = chain.request();
        long t1 = System.nanoTime();//请求发起的时间

        String method = request.method();
        if ("POST".equals(method)) {
            StringBuilder sb = new StringBuilder();
            if (request.body() instanceof FormBody) {
                FormBody body = (FormBody) request.body();
                for (int i = 0; i < body.size(); i++) {
                    sb.append(body.encodedName(i) + "=" + body.encodedValue(i) + ",");
                }
                sb.delete(sb.length() - 1, sb.length());
                Log.d("123===",String.format("发送请求 %s on %s %n%s %nRequestParams:{%s}",
                        request.url(), chain.connection(), request.headers(), sb.toString()));
            }
        } else {
            Log.d("123===",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(response.body().contentLength());
        Log.d("123===",
                String.format("接收响应: [%s] %n返回json:[%s] %.1fms %n%s",
                        response.request().url(),
                        responseBody.string(),
                        (t2 - t1) / 1e6d,
                        response.headers()
                ));
        return response;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值