此篇博客只講解okhttp的攔截器功能的詳細使用,若是你還不太瞭解okhttp能夠參考我另一篇博客 Android 開發 框架系列 OkHttp使用詳解html
在 Android 開發 框架系列 OkHttp使用詳解 能夠了解到okhttp的基本使用,初始化OkHttpClient的時候咱們能夠添加攔截器,以下:java
// 配置一些信息進入OkHttpClient
mOkHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(REQUEST_TIME, TimeUnit.SECONDS)
.readTimeout(REQUEST_TIME, TimeUnit.SECONDS)
.writeTimeout(REQUEST_TIME, TimeUnit.SECONDS)
.addInterceptor(new ())
.build();MyInterceptor
如上代碼,很簡單,只要利用addInterceptor方法就能夠添加攔截器,而自定義的攔截器只須要實現Interceptor
接口就好了,以下所示:json
public class MyInterceptor implements Interceptor { ... }
在有簡單的瞭解後,咱們來說解攔截器的一些使用情景.
網絡
在一些接口須要增長頭部信息或者修改頭部信息的時候,若是咱們直接對Request請求裏增長頭部字段不免會有增長耦合的問題.而在攔截器裏修改就能夠避免嚴重的耦合,以下代碼增長了Body的類型與token信息.app
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網絡日誌攔截器需添加如下依賴:
ide
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,並添加網絡日誌攔截器:
post
mOkHttpClient = new OkHttpClient.Builder() .addInterceptor(logInterceptor) //設置攔截器 .build();