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 源码图片如下
从添加头部拦截器的代码中,有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();
}
}