Okhttp 拦截器

         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,已经响应内容已打印出来









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值