1. 程式人生 > >Android okHttp網路請求之快取控制Cache-Control

Android okHttp網路請求之快取控制Cache-Control

前言:

    前面的學習基本上已經可以完成開發需求了,但是在專案中有時會遇到對請求做個快取,當沒網路的時候優先載入本地快取,基於這個需求我們來學習一直okHttp的Cache-Control。

     okHttp相關文章地址:

Cache-Control:

     Cache-Control指定請求和響應遵循的快取機制。在請求訊息或響應訊息中設定Cache-Control並不會修改另一個訊息處理過程中的快取處理過程。請求時的快取指令有下幾種:

  • Public指示響應可被任何快取區快取。
  • Private指示對於單個使用者的整個或部分響應訊息,不能被共享快取處理。這允許伺服器僅僅描述當用戶的部分響應訊息,此響應訊息對於其他使用者的請求無效。
  • no-cache指示請求或響應訊息不能快取
  • no-store用於防止重要的資訊被無意的釋出。在請求訊息中傳送將使得請求和響應訊息都不使用快取。
  • max-age指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。
  • min-fresh指示客戶機可以接收響應時間小於當前時間加上指定時間的響應。
  • max-stale指示客戶機可以接收超出超時期間的響應訊息。如果指定max-stale訊息的值,那麼客戶機可以接收超出超時期指定值之內的響應訊息。

CacheControl.java類介紹:

   1.)常用的函式:如下程式碼,裡面已經加了註釋就不一一解釋了,每個函式都是對應一個快取指令設定
           final CacheControl.Builder builder = new CacheControl.Builder();
            builder.noCache();//不使用快取,全部走網路
            builder.noStore();//不使用快取,也不儲存快取
            builder.onlyIfCached();//只使用快取
            builder.noTransform();//禁止轉碼
            builder.maxAge(10, TimeUnit.MILLISECONDS);//
指示客戶機可以接收生存期不大於指定時間的響應。 builder.maxStale(10, TimeUnit.SECONDS);//指示客戶機可以接收超出超時期間的響應訊息 builder.minFresh(10, TimeUnit.SECONDS);//指示客戶機可以接收響應時間小於當前時間加上指定時間的響應。 CacheControl cache = builder.build();//cacheControl
 2.)兩個CacheControl常量介紹:
            CacheControl.FORCE_CACHE; //僅僅使用快取
            CacheControl.FORCE_NETWORK;// 僅僅使用網路

舉例,我們設定一個有效期為10秒的CacheControl

            final CacheControl.Builder builder = new CacheControl.Builder();
            builder.maxAge(10, TimeUnit.MILLISECONDS);
            CacheControl cache = builder.build();
3.)請求時如何使用
            final CacheControl.Builder builder = new CacheControl.Builder();
            builder.maxAge(10, TimeUnit.MILLISECONDS);
            CacheControl cache = builder.build();
            final Request request = new Request.Builder().cacheControl(cache).url(requestUrl).build();
            final Call call = mOkHttpClient.newCall(request);//
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    failedCallBack("訪問失敗", callBack);
                    Log.e(TAG, e.toString());
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    if (response.isSuccessful()) {
                        String string = response.body().string();
                        Log.e(TAG, "response ----->" + string);
                        successCallBack((T) string, callBack);
                    } else {
                        failedCallBack("伺服器錯誤", callBack);
                    }
                }
            });
            return call;
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }

以上如果cache沒有過去會直接返回cache而不會發起網路請求,若過期會自動發起網路請求。注意:如果您使用FORCE_CACHE和網路的響應需求,OkHttp則會返回一個504提示,告訴你不可滿足請求響應。所以我們加一個判斷在沒有網路的情況下使用

       //判斷網路是否連線
        boolean connected = NetworkUtil.isConnected(context);
         if (!connected) {
             request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
          }

okHtitp知識擴充套件:

1.)Interceptor攔截器,見名知意就是攔截操作,這裡用來攔截Request對其做一些特殊處理,舉例:比如上面我們使用到了CacheControl,我們怎麼攔截一個請求在網路不可用的時候使用CacheControl.FORCE_CACHE;
        OkHttpClient.Builder newBuilder = mOkHttpClient.newBuilder();
         newBuilder.addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                boolean connected = NetworkUtil.isConnected(context);
                if (!connected) {
                    request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
                }
                Response response = chain.proceed(request);

                return response;
            }
        });
2.)OkHttp 提供了對使用者認證的支援。當 HTTP 響應的狀態程式碼是 401 時,OkHttp 會從設定的 Authenticator 物件中獲取到新的 Request 物件並再次嘗試發出請求。Authenticator 介面中的 authenticate 方法用來提供進行認證的 Request 物件.
        OkHttpClient client = new OkHttpClient();
        client.newBuilder().authenticator(new Authenticator() {
            @Override
            public Request authenticate(Route route, Response response) throws IOException {
                String credential = Credentials.basic("user", "password");
                return response.request().newBuilder()
                        .header("Authorization", credential)
                        .build();
            }
        });

小結:okHttp的簡單使用到此介紹完畢,至於很多高階使用還有待研究。接下來準備研究下OkHttp與retrofit結合使用。

相關推薦

Android okHttp網路請求快取控制Cache-Control

前言:     前面的學習基本上已經可以完成開發需求了,但是在專案中有時會遇到對請求做個快取,當沒網路的時候優先載入本地快取,基於這個需求我們來學習一直okHttp的Cache-Control。      okHttp相關文章地址: Cache-Control:      Cache-Contro

Android 網路開發(一) okHttp網路請求快取控制Cache-Control

Cache-Control: Cache-Control指定請求和響應遵循的快取機制。在請求訊息或響應訊息中設定Cache-Control並不會修改另一個訊息處理過程中的快取處理過程。請求時的快取指令有下幾種: Public指示響應可被任何快取區快取。 Private指示對於單個

Android okHttp網路請求Retrofit+Okhttp+RxJava組合

前言:     通過上面的學習,我們不難發現單純使用okHttp來作為網路庫還是多多少少有那麼一點點不太方便,而且還需自己來管理介面,對於介面的使用的是哪種請求方式也不能一目瞭然,出於這個目的接下來學習一下Retrofit+Okhttp的搭配使用。      okHttp相關文章地址: Retrof

Android okHttp網路請求檔案上傳下載

前言:    前面介紹了基於okHttp的get、post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天來實現一下基於okHttp的檔案上傳、下載。      okHttp相關文章地址: 檔案上傳: 1.)不帶引數上傳檔案

Android okHttp網路請求Get/Post請求

   前言:       之前專案中一直使用的Xutils開源框架,從xutils 2.1.5版本使用到最近的xutils 3.0,使用起來也是蠻方便的,只不過最近想著完善一下app中使用的開源框架,由於Xutils裡面包含的東西相對來說比較雜,有資料庫、圖片快取、註解、網路請求等等,秉著一個開源庫只處理一

Android okHttp網路請求Json解析

  前言:   前面兩篇文章介紹了基於okHttp的post、get請求,以及檔案的上傳下載,今天主要介紹一下如何和Json解析一起使用?如何才能提高開發效率?      okHttp相關文章地址:  關於Json解析:   本文的Json解析採用阿里巴巴的FastJson 解析,也可以採用Gso

Android----------OkHttp網路請求框架Get和Post簡單封裝(泛型)

請求框架的類: OkHttp依賴: compile 'com.squareup.okhttp3:okhttp:3.8.1' RecyclerView依賴: compile 'com.android.support:recyclerview-v7:26.0.0-alpha1

Android網路請求OkHttp框架

首先宣告許可權 <uses-permission android:name="android.permission.INTERNET"/> 在build.gradle中加入 compile 'com.squareup.okhttp:okhttp:2.4.0' compile

Volley網路框架快取載入圖片、Post與get的資料請求

         前言:Volley作為主流網路框架之一,必然有它的優點。Volley可是說是把AsyncHttpClient和Universal-Image-Loader的優點集於了一身, 它的常用在資料量不大,但網路通訊頻繁,而且有圖片快取

Android 網路請求Xutils環境搭建

Xutils 在Android 開發中是一個比較老的網路請求框架,目前在市面上,仍然有一些老的專案在使用和維護. 本文給需要使用Xutils網路請求框架的朋友,提供一個快速搭建的程式碼參考: app的module build,gradle中 新增: compile 'org.xuti

AndroidOkHttp 網路請求框架的學習封裝

自述:在此以前,自己從來沒有寫過部落格,今天是第一次寫,真心是有點小激動,正要下筆卻不知道應該從何說起,若是寫的不好,請各位見諒吧!關於網路請求,我自認為自己是一個菜鳥,沒有任何經驗,之前做的專案都是別人封裝好,告訴我怎麼呼叫就好了。至於怎麼封裝邏輯的,真是一竅不通,可近來

Android常用網路請求框架xUtils、OkHttp、Volley、Retorfit對比

網路請求框架總結1.xutils     此框架龐大而周全,這個框架可以網路請求,同時可以圖片載入,又可以資料儲存,又可以 View 註解,使用這種框架很方便,這樣會使得你整個專案對它依賴性太強,萬一以後這個庫不維護了,或者中間某個模組出問題了,這個影響非常大,所以在專案開發時,一般會更喜歡選擇專注某一領域

Android——Retrofit網路請求

Retrofit使用步驟 步驟1:新增庫和網路許可權 compile 'com.squareup.retrofit2:retrofit:2.2.0' compile 'com.squareup.retrofit2:converter-gson:2.2.0' compile 'com.

OkHttp網路請求

build.gradle裡新增 implementation 'com.squareup.okhttp3:okhttp:3.4.2' .activity private GridAdapter mGridAdapter; //獲得九宮格資料 okhttpnet2 = new o

Fragment標籤頁+OKHttp網路請求資料+MVP模式

分包方式 需要的第三方依賴 Fragment 新建兩個fragment MainActivity 主頁面佈局 設定Fragment+tablayout的介面卡 Fragment標籤頁結束 OKHttp網路請求 okhttputils工具類

Android OkHttp 網路獲取輪播圖

1.首先匯入依賴 /*輪播圖 依賴*/ implementation 'com.youth.banner:banner:1.4.9' //okhttp3 implementation 'com.github.bumptech.glide:glide:4.

利用Fiddler對Android模擬器網路請求進行抓包

1.安裝使用Fiddler 下載地址:https://www.telerik.com/download/fiddler 2.安裝Android模擬器夜神 下載地址:https://www.yeshen.com/ 3. 開啟Fiddler進行相關設定 設定捕獲https,開啟Fid

網路請求urllib網路請求

urllib庫是Python中一個最基本的網路請求庫。可以模擬瀏覽器的行為,向指定的伺服器傳送一個請求,並可以儲存伺服器返回的資料。 urlopen函式: 在Python3的urllib庫中,所有和網路請求相關的方法,都被集到urllib.request模組下面了,以先來看下ur

Android開發-網路請求資料

如何用網路請求資料呢? 第一步 建立一個工具類NetWorks 在工具類中寫一個方法(getJson) 這個類裡可以寫很多方法 不僅僅限於網路請求資料 比如常見的還有判斷網路的連線狀態等等…在其他的頁面可以呼叫到這個工具類裡的方法 public class NetWorks {

列印完整的okhttp網路請求和響應訊息

背景 開發中,有時需要核對介面請求和響應引數,需要看到詳細的介面呼叫。本來可以通過Facebook Stetho來監控介面的,但是受限於網路,導致調測介面打不開,所以只要尋求其他方案。 解決方案 通過okhttp新增攔截器,列印介面呼叫日誌。 新增依賴 imple