「本文已參與好文召集令活動,點選檢視:後端、大前端雙賽道投稿,2萬元獎池等你挑戰!」
老王的煩惱
昔日的小王憑藉這他的小心謹慎和藉助漂亮能幹的女友 Dio 的輔助,終於幹下了一番事業,成為中華大地響噹噹的人物,小王也變成老王。如今,老王已經年近花甲,看似邁上了人生巔峰,卻也遇到了人生的煩惱——那就是他的兒子,新的小王。
小王和他爹當年的小心謹慎不同,小王自海外留學回來,也不願意接手老王的事業。反而迷戀起了網際網路,玩遊戲、微博噴人、撩網紅等等。前兩項倒還好,但是後一項,讓老王心煩得很。這網紅哪能隨便撩的,萬一弄出許多小小王來,多大家業都不夠分的啊!
能幹的老王媳婦
關鍵時刻,還是老王的媳婦,曾經被金屋藏嬌的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;
}
複製程式碼
這下小王在網際網路就完全被監視了——而且他壓根不知道!只是,每次他說要錢的時候,老王不再隨便給了!
但這個時候,小王還能在網上撩,畢竟上網在這個時代是不怎麼要錢的。
狠心的老王媳婦
老王媳婦 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;
}
複製程式碼
消停的小王
小王這下子懵圈了,難道是他的那些“土味情話”已經失效了?每次發出去訊息都遭受到了無情的打擊,讓他心灰意冷。漸漸地他就淡出了網際網路,至於現在在幹什麼,誰也不知道。感覺又像是當初老王金屋藏嬌一樣,現在的小王也逐漸被隱藏了起來。從此,網際網路只剩下小王和各個網紅的傳說。
後記
藉著老王和小王的故事,我們講述了 Dio 的封裝和 Dio 的攔截器。其中攔截器可以應用於很多實際場景:
- 許可權驗證:比如介面請求後端返回401未授權時可以跳到登入頁,403跳到未授權頁面;
- 異常監控:可以在攔截器處理異常,並且上報到異常監控後臺或者傳送異常預警訊息;
- 快取介面:可以對於某些介面將請求快取在本地,設定一定的快取有效時限,在時限內重複請求時直接返回本地快取資料,而無需請求後端介面,降低後端伺服器負荷。這塊可以參考dio-http-cache。
- Cookie:App 本身是不會快取 Cookie 資訊的,可以使用攔截器在向後端發起請求時自動攜帶 Cookie資訊,可以參考cookie_manager。
- 生成介面文件:可以在攔截器將請求引數,返回結果輸出為 Postman格式的介面文件,參考postman_dio。
- 自定義攔截器:可以自定義自己的攔截器類,繼承
Interceptor
類,實現onRequest
,onResponse
和onError
方法即可。
注意,Dio 的例項可以同時新增多個攔截器,以便處理不同的情況。