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

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

老王的煩惱

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

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

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

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

狠心的老王媳婦

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

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

消停的小王

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

image.png

後記

藉着老王和小王的故事,咱們講述了 Dio 的封裝和 Dio 的攔截器。其中攔截器能夠應用於不少實際場景:oop

  • 權限驗證:好比接口請求後端返回401未受權時能夠跳到登陸頁,403跳到未受權頁面;
  • 異常監控:能夠在攔截器處理異常,而且上報到異常監控後臺或者發送異常預警消息;
  • 緩存接口:能夠對於某些接口將請求緩存在本地,設定必定的緩存有效時限,在時限內重複請求時直接返回本地緩存數據,而無需請求後端接口,下降後端服務器負荷。這塊能夠參考dio-http-cache
  • Cookie:App 自己是不會緩存 Cookie 信息的,可使用攔截器在向後端發起請求時自動攜帶 Cookie信息,能夠參考cookie_manager
  • 生成接口文檔:能夠在攔截器將請求參數,返回結果輸出爲 Postman格式的接口文檔,參考postman_dio
  • 自定義攔截器:能夠自定義本身的攔截器類,繼承Interceptor類,實現 onRequestonResponseonError方法便可。

注意,Dio 的實例能夠同時添加多個攔截器,以便處理不一樣的狀況。

相關文章
相關標籤/搜索