Android 開發 框架系列 OkHttp攔截器


前言

  此篇博客只講解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();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM