Retrofit 拦截器(请求头和logger打印)

Retrofit拦截器学习

请求头拦截器

在我们使用Retrofit框架做网络请求的时候,一般情况下都会有一些共同的请求头,这些参数可以通过注解的形 式在我们定义的后台接口API中添加,如果接口少的情况下,可以直接写可以,如果很多的情况下,这就会让
人很烦恼,我们会想有什么方式会可以给它们一次添加其共同拥有呢,答案是有的,就是我们的拦截器。下面 就是讲述一下请求头和logger打印的拦截器。

请求头拦截器,代码如下

//添加头部信息
    Interceptor headerInterceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request build = chain.request().newBuilder()
                    .addHeader("content-type", "application/json")
                    .addHeader("tenant_id", "11")
                    .addHeader("user_id", "11")
                    .addHeader("access_token", "12345678")
                    .build();
            return chain.proceed(build);
        }
    };

根据拦截器Interceptor 源码,我们能获取到两个重要的参数Request和Response,而接口在回调时候会接收一个Chain类型的参数,这个参数保存了Request 和Response相关的数据。Interceptor 源码图片如下

拦截器源码610.jpg

从添加头部拦截器的代码中,有chain.proceed(build),它是将拦截连串起来的关键。
这里详细分析请看:(https://www.cnblogs.com/LuLei1990/p/5534791.html)

打印请求地址,请求体,数据格式和请求参数log的拦截器代码如下:

   private Interceptor RetrofitLogInterceptor = new Interceptor() {
     @Override
      public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        long startTime = System.currentTimeMillis();
        okhttp3.Response response = chain.proceed(chain.request());
        long endTime = System.currentTimeMillis();
        long duration = endTime - startTime;
        okhttp3.MediaType mediaType = response.body().contentType();
        String content = response.body().string();

        Log.e("请求地址", "intercept: " + request.toString());
        Log.e("请求体", "intercept: " + content);
        Log.e("数据格式", "intercept: " + mediaType);
        printParams(request.body());
        Log.e("时间", "----------请求耗时:" + duration + "毫秒----------");
        return response.newBuilder().body(okhttp3.ResponseBody.create(mediaType, content)).build();
    }
};

private void printParams(RequestBody body) {
    Buffer buffer = new Buffer();
    try {
        body.writeTo(buffer);
        Charset charset = Charset.forName("UTF-8");
        MediaType contentType = body.contentType();
        if (contentType != null) {
            charset = contentType.charset(UTF_8);
        }
        String params = buffer.readString(charset);
        Log.e("请求参数", "printParams: " + params);

    } catch (IOException e) {
        e.printStackTrace();
    }
}  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容