okhttp之自定義攔截器

轉載請以鏈接形式標明出處:
本文出自:103style的博客


base on 3.12.0


目錄

  • 前言
  • LogInterceptor實踐
  • addInterceptoraddNetworkInterceptor 的區別

前言

前面我們在 RealCall.execute()流程介紹okhttp之五個攔截器的介紹 中介紹了攔截器的執行順序 和 每個自帶攔截器的作用。

我們知道 我們自定義的攔截器會最先執行,在由響應結果之後也會最後處理。

沒看過 RealCall.execute()流程介紹okhttp之五個攔截器的介紹 的小夥伴可以先去看看。

官方關於攔截器的介紹 :戳我


LogInterceptor 實踐

自定義攔截器主要的邏輯就是:

  • 實現Interceptor接口,重寫 intercept(Interceptor.Chain chain)方法
  • 調用 Response response = chain.proceed(request); 傳遞給下一層攔截器獲取他的返回結果。
    如下:
/**
 * @author https://github.com/103style
 * @date 2019/9/10 14:15
 */
public class LogInterceptor implements Interceptor {

    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        //此三行代碼是每個自定義攔截器中必須的
        Request request = chain.request();
        Response response = chain.proceed(request);
        return response;
    }
}

intercept(...) 中的三行代碼是每個自定義攔截器中必須的

通過這三行代碼,我們可以獲取到 請求 和 響應 的信息。然後根據具體的業務需求去做對應的操作,比如日誌打印json轉化數據解密 等。

當然也可以獲取ConnectionCall以及以下操作 :

Connection connection();
Call call();
int connectTimeoutMillis();
Chain withConnectTimeout(int timeout, TimeUnit unit);
int readTimeoutMillis();
Chain withReadTimeout(int timeout, TimeUnit unit);
int writeTimeoutMillis();
Chain withWriteTimeout(int timeout, TimeUnit unit);

打印日誌的示例代碼如下:

/**
 * @author https://github.com/103style
 * @date 2019/9/10 14:15
 */
public class LogInterceptor implements Interceptor {

    private static final String TAG = "LogInterceptor";

    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request request = chain.request();

        long t1 = System.nanoTime();
        Log.d(TAG, "request = " + request.toString());
        
        Response response = chain.proceed(request);

        long t2 = System.nanoTime();
        //1e6d = 10的6的方
        Log.d(TAG, "time cost = " + (t2 - t1) / 1e6d + "ms \n response = " + response.toString());

        return response;
    }
}

然後通過 OkHttpClient配置攔截器:

client = new OkHttpClient.Builder()
        .addInterceptor(new LogInterceptor())
        .build();

or

client = new OkHttpClient.Builder()
        .addNetworkInterceptor(new LogInterceptor())
        .build();

兩種方式主要的區別是 addInterceptor 是最先執行的攔截器, addNetworkInterceptor是在ConnectInterceptor之後執行的攔截器。 可以在 RealCall.execute()流程介紹 知道。

官方的解釋

addInterceptor
無需擔心中間響應,例如重定向和重試。
即使從緩存提供HTTP響應,也總是被調用一次。
遵守應用程序的原始意圖。不關心OkHttp注入的標頭,例如If-None-Match
允許短路而不是Chain.proceed()
允許重試並多次調用Chain.proceed()

addNetworkInterceptor
能夠對諸如重定向和重試之類的中間響應進行操作。
不會在讀取緩存時調用。
觀察數據,就像通過網絡傳輸數據一樣。
訪問Connection帶有請求的。


以上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章