前言
此篇博客只讲解okhttp的拦截器功能的详细使用,如果你还不太了解okhttp可以参考我另外一篇博客 Android 开发 框架系列 OkHttp使用详解
添加Interceptor的简单例子
在 Android 开发 框架系列 OkHttp使用详解 可以了解到okhttp的基本使用,初始化OkHttpClient的时候我们可以添加拦截器,如下:
// 配置一些信息进入OkHttpClient
mOkHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(REQUEST_TIME, TimeUnit.SECONDS)
.readTimeout(REQUEST_TIME, TimeUnit.SECONDS)
.writeTimeout(REQUEST_TIME, TimeUnit.SECONDS)
.addInterceptor(new MyInterceptor
())
.build();
如上代码,很简单,只要利用addInterceptor方法就可以添加拦截器,而自定义的拦截器只需要实现Interceptor
接口就行了,如下所示:
public class MyInterceptor implements Interceptor { ... }
在有简单的了解后,我们来讲解拦截器的一些使用情景.
修改header头部信息
在一些接口需要增加头部信息或者修改头部信息的时候,如果我们直接对Request请求里增加头部字段难免会有增加耦合的问题.而在拦截器里修改就可以避免严重的耦合,如下代码增加了Body的类型与token信息.
public class HttpHeaderInterceptor implements Interceptor { private String token; public HttpHeaderInterceptor(String token) { this.token = token; } @Override public Response intercept(@NonNull Chain chain) throws IOException { // 配置请求头 String accessToken = "token"; Request.Builder builder = chain.request().newBuilder(); builder.header("Content-Type", "application/json") //增加body类型 .header("Accept", "application/json"); builder.header(accessToken, token); //增加token Request request = builder.build(); return chain.proceed(request); //继续发送 } }
拦截取消请求
public class HttpHeaderInterceptor implements Interceptor { private String token; public HttpHeaderInterceptor(String token) { this.token = token; } @Override public Response intercept(@NonNull Chain chain) throws IOException { // 配置请求头 if (TextUtils.isEmpty(token)){ chain.call().cancel(); return null; } //略...... } }
网络日志拦截
使用okhttp网络日志拦截器需添加以下依赖:
implementation ‘com.squareup.okhttp3:logging-interceptor:3.6.0‘
定义拦截器中的网络日志工具:
HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.d("logInterceptor", message);
}
});
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
初始化OkHttpClient,并添加网络日志拦截器:
mOkHttpClient = new OkHttpClient.Builder()
.addInterceptor(logInterceptor) //设置拦截器
.build();