okhttp拦截器用于拦截网络请求,以及响应。在拦截网络请求时可以重定向请求,重写响应体的功能。具体原理自行百度,该文章主要讲如何使用拦截器进行添加header请求头,打印响应内容。代码如下:
//拦截器,添加header,token,并打印访问,请求信息 public class MyInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { final Request originalRequest = chain.request(); Request request = originalRequest.newBuilder() .addHeader("Content-Type", "application/json") .addHeader("Authorization", "Bearer "+myApplication.token) .build(); //打印请求日志 System.out.println("request url:"+request.url() + " requrest body:"+request.body().toString()); okhttp3.Response response = chain.proceed(request); okhttp3.MediaType mediaType = response.body().contentType(); String content = response.body().string(); //打野请求返回日志 System.out.println("response url:"+response.request().url()+"response content:"+content); // response.body().string()被读取之后,连接将会中断,需要返回一个新的response,否则将异常 return response.newBuilder() .body(okhttp3.ResponseBody.create(mediaType, content)) .build(); } }
Request request = originalRequest.newBuilder() .addHeader("Content-Type", "application/json") .addHeader("Authorization", "Bearer "+myApplication.token) .build();如上代码,在拦截出重写了request的header内容,添加了tokenheader
同时在响应成功后,获取了response.body()内容,这个地方需要主要,在获取了内容之后,整个连接会关闭,再次返回
response = chain.proceed(request)会出现异常,所以我们需要重新构建一个response用于返回
return response.newBuilder() .body(okhttp3.ResponseBody.create(mediaType, content)) .build();
实现了自己的拦截器之后,只需要在初始化okhttp时加入拦截器就可以了
client = new OkHttpClient.Builder() .addInterceptor(new MyInterceptor()) // .addNetworkInterceptor(new MyInterceptor()) .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(100, TimeUnit.SECONDS).build();注释的地方为网络拦截器,没有注释的地方为应用拦截器,在这里没有什么区别。
添加之后代码进行测试,结果如下:
12-13 17:09:43.696 29564-32737/com.jywl.yunjiatianxia I/System.out: request url:http://115.28.214.92:8090/app/getzjlist.json requrest body:okhttp3.RequestBody$2@452a4a80
12-13 17:09:43.821 29564-32737/com.jywl.yunjiatianxia I/System.out: response url:http://115.28.214.92:8090/app/getzjlist.jsonresponse content:{"bizData":{"zjlist":[{"zj_id":"39","zj_type":1,"zj_alias":"1号楼","im_id":"ZJ_9053B8AB446450D1"}]},"md5":"4152e3ccac16f3b7446fc96ba14543de","msg":"","needRefresh":true,"rtnCode":"0","ts":1481620184072}
请求前的url,已经响应后的url,已经响应内容已打印出来