OkHttp拦截请求与相应,以及控制台打印日志(Interceptor拦截器)

OkHttp拦截请求与相应,以及控制台打印日志(Interceptor拦截器)

本文将简单介绍OkHttp拦截器的使用,具体环境是这样:服务器有一个接口,在不同环境下,返回的数据和格式不同,你还想获取这两种不同的数据,那么我想到了用拦截器。

拦截器的作用是什么,举一个例子,小明在玩王X荣耀,偶遇队友抢五杀,小明忍不住发了一句傻X,在游戏界面中却显示出来**(连骂人都骂不出来,lj游戏啊),其实游戏拦截了你的信息,首先看看这个请求(或者相应)有什么不对,如果有不对那么就改一下,继续向下传递。

在创建OkHttpClient对象的时候,可以添加拦截器,代码如下:

var client: OkHttpClient? = OkHttpClient.Builder().connectTimeout(60,
                TimeUnit.SECONDS).readTimeout(10, TimeUnit.SECONDS).writeTimeout(20,
                TimeUnit.SECONDS)
                .addInterceptor(MyInterceptor())
                .build()

在倒数第二行添加的拦截器,而MyInterceptor就是我自定义的拦截器了,下面是MyInterceptor.kt

class MyInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain?): Response {
        return chain!!.proceed(chain!!.request())
    }
}

首先我们直接继承Interceptor ,那么会重写一个Interceptor 函数,有一个参数chain,chain是链的意思,所以应该是通过chain把一系列的动作连起来,点开Chain,发现是一个接口,有三个方法?这是啥?果断打开okhttp文档看个究竟,proceed(Request request)这个方法比较重要,根据指定的请求生产相应的,那请求就应该在request()返回,下面来看一下自定义的拦截器吧:

Request request = chain.request();

long t1 = System.nanoTime();
logger.info(String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers()));

Response response = chain.proceed(request);

long t2 = System.nanoTime();
logger.info(String.format("Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers()));

return response;

以上代码放在重写的方法中即可,通过chain对象获取一个请求,通过proceed方法获取一个相应,在必要的过程中打印一下必要的信息。当然你也可以在这里打印获取的json数据,在控制台打印出来,提高效率。
ps:
okHttp相应拦截器,response.body.string,只能调用一次,若直接返回response则会报java.lang.IllegalStateException: closed,java.lang.IllegalStateException: closed异常
所以从新构建一个response进行返回,代码如下:

var mediaType = response.body().contentType()
return response.newBuilder()
                .body(ResponseBody.create(mediaType, str))
                .build()

所以可以修改请求或者相应,重新进行构建即可。

你可能感兴趣的:(OkHttp拦截请求与相应,以及控制台打印日志(Interceptor拦截器))