OkHttp3緩存的說(shuō)明

0、http基礎(chǔ)

這部分內(nèi)容我也是網(wǎng)上搜索到的,看到和緩存有關(guān)的幾個(gè)關(guān)鍵詞:
** private、no-cache、max-age、must- revalidate 、Expires、Cache-Control、ETag、Last-Modified-Date**
等,具體含義可以http 緩存的基礎(chǔ)知識(shí),但是以上關(guān)鍵字都是Get請(qǐng)求有關(guān)的,Post請(qǐng)求一般是沒法緩存的。
為什么沒法緩存呢? 因?yàn)閔ttp請(qǐng)求只是緩存 請(qǐng)求查詢操作,更新服務(wù)器數(shù)據(jù)是沒有緩存的,為什么沒有緩存呢,因?yàn)橐话闱闆rhttp緩存都是把請(qǐng)求的url作為key,相應(yīng)內(nèi)容作為value 來(lái)進(jìn)行緩存的,大家也知道post請(qǐng)求中的url是一樣的,變化的是請(qǐng)求體,所以一般http不緩存post請(qǐng)求。
但是既然我們知道了問(wèn)題,肯定有人能想到辦法來(lái)通過(guò)添加請(qǐng)求頭來(lái)緩存post請(qǐng)求 這篇文章說(shuō)明了 post請(qǐng)求也可以緩存,但是文章也說(shuō)了 需要服務(wù)器配合,如果服務(wù)器不配合那么只能手工存儲(chǔ)數(shù)據(jù)來(lái)實(shí)現(xiàn)緩存了!

1、Okhttp緩存數(shù)據(jù)

首先如果是get請(qǐng)求,那么就用網(wǎng)上各種文章中的方法,就是添加okhttp攔截器,添加請(qǐng)求頭的方式來(lái)緩存

private final Interceptor mRewriteCacheControlInterceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            String cacheControl = request.cacheControl().toString();
            if (!NetWorkUtils.isNetConnected(BaseApplication.getContext())) {
                request = request.newBuilder()
                        .cacheControl(TextUtils.isEmpty(cacheControl)? CacheControl.FORCE_CACHE:CacheControl.FORCE_NETWORK)
                        .build();
            }
            Response originalResponse = chain.proceed(request);
            if (NetWorkUtils.isNetConnected(BaseApplication.getContext())) {
                //有網(wǎng)的時(shí)候連接服務(wù)器請(qǐng)求,緩存一天
                return originalResponse.newBuilder()
                        .header("Cache-Control", "public, max-age=" + MAX_AGE)
                        .removeHeader("Pragma")
                        .build();
            } else {
                //網(wǎng)絡(luò)斷開時(shí)讀取緩存
                return originalResponse.newBuilder()
                        .header("Cache-Control", "public, only-if-cached, max-stale=" + CACHE_STALE_SEC)
                        .removeHeader("Pragma")
                        .build();
            }
        }
    };

但是如果是post請(qǐng)求,那就只能用下面方式了

  1. 數(shù)據(jù)庫(kù)緩存 Sqlite 這篇文章有說(shuō)明 數(shù)據(jù)庫(kù)緩存
  2. 文件緩存 DiskLruCache 這篇文章有說(shuō)明 文件緩存

3、Okhttp是不支持post緩存的

通過(guò)看okhttp源碼知道 okhttp3 -> Cache -> put方法

CacheRequest put(Response response) {
    String requestMethod = response.request().method();

    if (HttpMethod.invalidatesCache(response.request().method())) {
      try {
        remove(response.request());
      } catch (IOException ignored) {
        // The cache cannot be written.
      }
      return null;
    }
    if (!requestMethod.equals("GET")) {
      // Don't cache non-GET responses. We're technically allowed to cache
      // HEAD requests and some POST requests, but the complexity of doing
      // so is high and the benefit is low.
      return null;
    }

   ...
  }

從源碼中知道,okhttp會(huì)首先判斷請(qǐng)求方式,如果不是GET請(qǐng)求就直接返回了,不做任何緩存操作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,923評(píng)論 18 139
  • Volley源碼分析之流程和緩存 前言 Android一開始提供了HttpURLConnection和HttpCl...
    大寫ls閱讀 636評(píng)論 0 6
  • 參考Android網(wǎng)絡(luò)請(qǐng)求心路歷程Android Http接地氣網(wǎng)絡(luò)請(qǐng)求(HttpURLConnection) 一...
    合肥黑閱讀 21,343評(píng)論 7 63
  • 大家好,之前我們講解了Okhttp網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求相關(guān)的內(nèi)容,這一節(jié)我們講講數(shù)據(jù)緩存的處理。本節(jié)按以下內(nèi)容講解Okht...
    Ihesong閱讀 10,528評(píng)論 6 26
  • 被瑣碎的陰霾籠罩著 萬(wàn)分惆悵 殘輝的芒在云間游蕩 迷失方向 而我 一副空空如也的軀殼 踏著青草 無(wú)所感覺 任由身后...
    不呆的書呆子閱讀 267評(píng)論 0 2