前言
此篇博客只講解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; } //略...... } }
網絡日志攔截
請注意! 如果你OkHttpClient需要用於下載文件請不要添加網絡日志攔截,否則會影響流的回調
使用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();