Flutter 入門與實戰(二十九):Dio 之攔截器

島上碼農發表於2021-07-15

「本文已參與好文召集令活動,點選檢視:後端、大前端雙賽道投稿,2萬元獎池等你挑戰!

老王的煩惱

昔日的小王憑藉這他的小心謹慎和藉助漂亮能幹的女友 Dio 的輔助,終於幹下了一番事業,成為中華大地響噹噹的人物,小王也變成老王。如今,老王已經年近花甲,看似邁上了人生巔峰,卻也遇到了人生的煩惱——那就是他的兒子,新的小王。

小王和他爹當年的小心謹慎不同,小王自海外留學回來,也不願意接手老王的事業。反而迷戀起了網際網路,玩遊戲、微博噴人、撩網紅等等。前兩項倒還好,但是後一項,讓老王心煩得很。這網紅哪能隨便撩的,萬一弄出許多小小王來,多大家業都不夠分的啊!

image.png

能幹的老王媳婦

關鍵時刻,還是老王的媳婦,曾經被金屋藏嬌的Dio 想出了新的招術,再次讓老王佩服不已。老王媳婦Dio給小王搞了個攔截器,只要小王要在網際網路做什麼,都會被她給先攔截下來,然後她再根據小王要做的事情決定是不是要替他發出去;或者是收到什麼訊息的時候,也會先看一遍,沒問題再給小王看。而且,最為關鍵的是,小王對這一切壓根都不知道! ​

老王媳婦一開始是這麼幹的,小王在網際網路有什麼新的動向直接向老王彙報。

static Dio getDioInstance() {
  if (_dioInstance == null) {
    _dioInstance = Dio();
    _dioInstance.interceptors
        .add(InterceptorsWrapper(onRequest: (options, handler) {
      print('報告老王,小王看上了新的網紅:' + options.path);
      return handler.next(options);
    }, onResponse: (response, handler) {
      print('報告老王,小王收到了新網紅的回覆:' + response.statusMessage);
      handler.next(response);
    }, onError: (DioError e, handler) {
      print('報告老王,小王被網紅噴啦!' + e.message);
      return handler.next(e);
    }));
  }

  return _dioInstance;
}
複製程式碼

這下小王在網際網路就完全被監視了——而且他壓根不知道!只是,每次他說要錢的時候,老王不再隨便給了!

image.png

但這個時候,小王還能在網上撩,畢竟上網在這個時代是不怎麼要錢的。

狠心的老王媳婦

老王媳婦 Dio 一看這種方式不行,就又心生一計,每次小王聊網紅的時候,直接狠心拒絕!

static Dio getDioInstance() {
  if (_dioInstance == null) {
    _dioInstance = Dio();
    _dioInstance.interceptors
        .add(InterceptorsWrapper(onRequest: (options, handler) {
      print('報告老王,小王看上了新的網紅:' + options.path);
      return handler.next(options);
    }, onResponse: (response, handler) {
      print('報告老王,小王收到了新網紅的回覆:' + response.statusMessage);
      throw new Exception('你死心吧!');
      //handler.next(response);
    }, onError: (DioError e, handler) {
      print('報告老王,小王被網紅噴啦!' + e.message);
      return handler.next(e);
    }));
  }

  return _dioInstance;
}
複製程式碼

image.png

消停的小王

小王這下子懵圈了,難道是他的那些“土味情話”已經失效了?每次發出去訊息都遭受到了無情的打擊,讓他心灰意冷。漸漸地他就淡出了網際網路,至於現在在幹什麼,誰也不知道。感覺又像是當初老王金屋藏嬌一樣,現在的小王也逐漸被隱藏了起來。從此,網際網路只剩下小王和各個網紅的傳說。

image.png

後記

藉著老王和小王的故事,我們講述了 Dio 的封裝和 Dio 的攔截器。其中攔截器可以應用於很多實際場景:

  • 許可權驗證:比如介面請求後端返回401未授權時可以跳到登入頁,403跳到未授權頁面;
  • 異常監控:可以在攔截器處理異常,並且上報到異常監控後臺或者傳送異常預警訊息;
  • 快取介面:可以對於某些介面將請求快取在本地,設定一定的快取有效時限,在時限內重複請求時直接返回本地快取資料,而無需請求後端介面,降低後端伺服器負荷。這塊可以參考dio-http-cache
  • Cookie:App 本身是不會快取 Cookie 資訊的,可以使用攔截器在向後端發起請求時自動攜帶 Cookie資訊,可以參考cookie_manager
  • 生成介面文件:可以在攔截器將請求引數,返回結果輸出為 Postman格式的介面文件,參考postman_dio
  • 自定義攔截器:可以自定義自己的攔截器類,繼承Interceptor類,實現 onRequestonResponseonError方法即可。

注意,Dio 的例項可以同時新增多個攔截器,以便處理不同的情況。

相關文章