摘要:本文由云社區(qū)發(fā)表絕大多數(shù)程序只考慮了接口正常工作的場(chǎng)景,而用戶在使用我們的產(chǎn)品時(shí)遇到的各類異常,全都丟在看似的中。在面板,還可以對(duì)請(qǐng)求進(jìn)行暫停延遲等網(wǎng)絡(luò)異常的模擬。小程序?qū)崿F(xiàn)最后,留一道思考題。
本文由云+社區(qū)發(fā)表
絕大多數(shù)程序只考慮了接口正常工作的場(chǎng)景,而用戶在使用我們的產(chǎn)品時(shí)遇到的各類異常,全都丟在看似 ok 的 try catch 中。如果沒有做好異常的兼容和兜底處理,會(huì)極大的影響用戶體驗(yàn),嚴(yán)重的還會(huì)帶來(lái)安全和資損風(fēng)險(xiǎn)。
接口異常,通??梢苑譃橐韵氯悾?/p>
CGI 邏輯出錯(cuò)。如調(diào)用方入?yún)⑷笔ь悩I(yè)務(wù)邏輯報(bào)錯(cuò);
服務(wù)不穩(wěn)定。如服務(wù)器不穩(wěn)定導(dǎo)致 nginx 各類 500、502,cgi 路徑調(diào)整導(dǎo)致的 404
用戶網(wǎng)絡(luò)環(huán)境差。如,網(wǎng)絡(luò)不穩(wěn)定、網(wǎng)速慢、運(yùn)營(yíng)商劫持等
那么,我們?cè)趯懘a時(shí),如何快速的模擬這些接口異常,做好程序的兼容處理呢?
今天向大家介紹網(wǎng)絡(luò)調(diào)試神器 whistle 的網(wǎng)絡(luò)異常調(diào)試方法,如果你還沒用過(guò) whistle,請(qǐng)參考《8102 年的程序員不需要 Hosts 和 Fiddler》。
假設(shè)我們有以下前端頁(yè)面 index.html,放置在自己的本地路徑:
接下來(lái),打開 whistle Rules 配置面板 http://127.0.0.1:8899/#rules ,配置模擬的 demo page 和 mock CGI:
*/mock file://({"code":0,"data":"success"}) # 配置 mock cgi 為模擬的 json 數(shù)據(jù) example.com file:///Users/kaiye/Projects/Markdown/20181213/ # 配置任意域名到本地 demo 目錄,這里注意替換成自己的路徑
打開 http://example.com ,正常邏輯下頁(yè)面展示出了綠色的 success ,現(xiàn)在我們開始加入一些網(wǎng)絡(luò)異常。
1、業(yè)務(wù)邏輯異常處理例如 CGI 沒有返回 data 字段,而是返回了一個(gè)錯(cuò)誤碼 code 和對(duì)應(yīng)的 message,針對(duì)這種業(yè)務(wù)邏輯異常我們只需在第二個(gè) then 中做好 code 值的判斷即可(注意,這里的 code、message、data 只是示例,實(shí)際業(yè)務(wù) CGI 中的 JSON 結(jié)構(gòu)體的字段名很可能不同):
fetch(`/mock?r=${Math.random()}`) .then(response => response.json()) .then((v) => { // 業(yè)務(wù)邏輯異常處理 if (v.code !== 0) { return Promise.reject(new Error(`ERROR_LOGIC_CODE:${v.code}`)); } document.getElementById("success").innerHTML = v.data; }) .catch((err) => { document.getElementById("fail").innerHTML = err.message; });
相應(yīng)的 whistle 配置如下:
*/mock file://({"code":12345,"message":"some_logic_error"}) # 模擬業(yè)務(wù)邏輯異常2、服務(wù)器異常處理
如果服務(wù)器直接拋出了 502 錯(cuò)誤碼,我們希望代碼能給用戶提示的同時(shí),再做一個(gè)異常上報(bào)。
fetch(`/mock?r=${Math.random()}`) .then((response) => { // 服務(wù)器異常處理 if (response.ok) { return response.json(); } return Promise.reject(new Error(`ERROR_STATUS_CODE:${response.status}`)); }) .then((v) => { // 業(yè)務(wù)邏輯異常處理 if (v.code !== 0) { return Promise.reject(new Error(`ERROR_LOGIC_CODE:${v.code}`)); } document.getElementById("success").innerHTML = v.data; }) .catch((err) => { const [type, value] = err.message.split(":"); // 異常類型上報(bào) console.log(type, value); document.getElementById("fail").innerHTML = err.message; });
通過(guò) whistle 的模擬配置如下:
*/mock statusCode://502 # 模擬 HTTP 狀態(tài)碼異常3、接口被劫持注入
如果 CGI 被運(yùn)營(yíng)商劫持注入,可能導(dǎo)致接口返回一個(gè)不合法的 JSON 結(jié)構(gòu),最前面的 response.json() 會(huì)拋異常,我們可以提前 catch ?。?/p>
fetch(`/mock?r=${Math.random()}`).then((response) => { // 服務(wù)器異常處理 if (response.ok) { return ( response .json() // 接口數(shù)據(jù)解碼異常處理 .catch(err => Promise.reject(new Error("ERROR_DECODE_JSON"))) ); } return Promise.reject(new Error(`ERROR_STATUS_CODE:${response.status}`)); });
whistle 模擬配置如下:
*/mock file://(hijacking{"code":0,"data":"success"}) # 模擬接口被劫持注入 1
借助 htmlAppend 和 values 配置,可以模擬更復(fù)雜的注入示例:
*/mock file://({"code":0,"data":"success"}) htmlAppend://{hijacking.html} # 模擬接口被劫持注入 24、用戶網(wǎng)絡(luò)不穩(wěn)定
如果我們要模擬請(qǐng)求發(fā)出 10 秒后斷網(wǎng)或網(wǎng)絡(luò)不通的情況,可以通過(guò) whistle 這樣配置:
*/mock reqDelay://10000 enable://abort # 模擬 10 秒超時(shí)后網(wǎng)絡(luò)不通
讓用戶苦苦等待 10 秒,再報(bào)錯(cuò)的體驗(yàn)太糟糕。我們可以封裝一個(gè)能配置超時(shí)時(shí)間的請(qǐng)求發(fā)送函數(shù),同時(shí)把上面提到的錯(cuò)誤異常都一起配置進(jìn)來(lái)。
這樣,自定義的 myFetch 只需關(guān)注業(yè)務(wù)具體邏輯,針對(duì)不同的 catch error 做對(duì)應(yīng)的處理。
除以上提到的協(xié)議命令字外,whistle 還支持 resSpeed 用于模擬低網(wǎng)速傳輸(單位:kb/s),tpl 協(xié)議則可以根據(jù)請(qǐng)求傳入?yún)?shù)來(lái)動(dòng)態(tài)模擬不同的數(shù)據(jù)。在 Frames 面板,還可以對(duì) WebSocket/Socket 請(qǐng)求進(jìn)行暫停、延遲等網(wǎng)絡(luò)異常的模擬。
小程序 fetch API 實(shí)現(xiàn)最后,留一道思考題。
近來(lái)微信小程序開發(fā)非?;?,小程序原生提供的 wx.request API 能用于發(fā)送 HTTPS 請(qǐng)求,請(qǐng)?jiān)谒幕A(chǔ)之上進(jìn)行封裝,支持 promise 調(diào)用和 timeout 超時(shí)時(shí)間定義(小程序默認(rèn)的請(qǐng)求超時(shí)定義在 app.json 中,不夠靈活),并針對(duì)以上提到的 HTTP 狀態(tài)碼異常、接口劫持注入、慢網(wǎng)絡(luò)、無(wú)網(wǎng)絡(luò)狀態(tài)等各種網(wǎng)絡(luò)異常進(jìn)行兼容處理。
歡迎留言分享你的代碼實(shí)現(xiàn)
此文已由作者授權(quán)騰訊云+社區(qū)發(fā)布
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100424.html
摘要:而且官方也給出了示例在回調(diào)函數(shù)中上報(bào)異常為了確保完全掌握小程序的運(yùn)行狀況,我們將異常上報(bào)。的微信小程序插件除了可以自動(dòng)捕獲異常外,還支持通過(guò)接口主動(dòng)上報(bào)異常。 近日看到一篇文章99%的程序都沒有考慮的網(wǎng)絡(luò)異常,開篇提到: 絕大多數(shù)程序只考慮了接口正常工作的場(chǎng)景,而用戶在使用我們的產(chǎn)品時(shí)遇到的各類異常,全都丟在看似 ok 的 try catch 中。如果沒有做好異常的兼容和兜底處理,會(huì)極...
摘要:為了進(jìn)一步確認(rèn),再次到威脅情報(bào)平臺(tái)進(jìn)行查詢。再結(jié)合我部署的容器停止時(shí)間進(jìn)行分析,應(yīng)該是在我部署完成后幾小時(shí)內(nèi)服務(wù)器被入侵的。要從根本上解決問(wèn)題需要進(jìn)行溯源分析,避免服務(wù)器再次被入侵。結(jié)合以上線索以及個(gè)人經(jīng)驗(yàn)分析,很可能利用的漏洞進(jìn)行入侵的。 容器為何自動(dòng)停止? 服務(wù)器為何操作卡頓? 進(jìn)程的神秘連接到底指向何處? 發(fā)現(xiàn)——自動(dòng)停止的容器 某日發(fā)現(xiàn)部署在服務(wù)器上的一個(gè)容器被停掉了,開始以為...
摘要:但的數(shù)據(jù)存在,而的數(shù)據(jù)存儲(chǔ)暫未了解但肯定是存在內(nèi)存中。測(cè)試對(duì)比物理機(jī)進(jìn)程。當(dāng)然,使用對(duì)容器進(jìn)行編排的時(shí)候,可以指定任何想要的網(wǎng)絡(luò)方式如采用的方式,,。 簡(jiǎn)介: rancher 自帶了一套網(wǎng)絡(luò)方案,可以實(shí)現(xiàn)跨機(jī)器的docker容器互聯(lián)。其原理大致是:在每個(gè)機(jī)器上通過(guò)docker啟動(dòng)一個(gè)路由容器,將docker容器啟動(dòng)時(shí)的ip定義為10.42網(wǎng)段,并在iptables中將10.42網(wǎng)段的請(qǐng)...
摘要:但的數(shù)據(jù)存在,而的數(shù)據(jù)存儲(chǔ)暫未了解但肯定是存在內(nèi)存中。測(cè)試對(duì)比物理機(jī)進(jìn)程。當(dāng)然,使用對(duì)容器進(jìn)行編排的時(shí)候,可以指定任何想要的網(wǎng)絡(luò)方式如采用的方式,,。 簡(jiǎn)介: rancher 自帶了一套網(wǎng)絡(luò)方案,可以實(shí)現(xiàn)跨機(jī)器的docker容器互聯(lián)。其原理大致是:在每個(gè)機(jī)器上通過(guò)docker啟動(dòng)一個(gè)路由容器,將docker容器啟動(dòng)時(shí)的ip定義為10.42網(wǎng)段,并在iptables中將10.42網(wǎng)段的請(qǐng)...
摘要:一系統(tǒng)運(yùn)維中網(wǎng)絡(luò)方面的規(guī)劃與思考在很多公司,崗位職責(zé)都是很明確的,專職轉(zhuǎn)崗,每人或者每組負(fù)責(zé)一塊業(yè)務(wù)。二系統(tǒng)運(yùn)維中網(wǎng)絡(luò)方面操作梳理在系統(tǒng)運(yùn)維中,經(jīng)常涉及的網(wǎng)絡(luò)方面的操作,一般由以下幾個(gè)方面組成。初步意見,交換機(jī)上線這臺(tái)機(jī)器所連端口。運(yùn)維是一門藝術(shù),也是一門苦差事,每個(gè)人對(duì)此均有不同的理解,正所謂一千個(gè)人眼中有一千個(gè)哈姆雷特。干一行就要愛一行,既然選擇了這個(gè)行業(yè),較好是能把它做到較好,發(fā)揮自己...
閱讀 1905·2021-11-23 09:51
閱讀 1549·2021-11-19 09:40
閱讀 3221·2021-11-11 11:01
閱讀 1120·2021-09-27 13:34
閱讀 1852·2021-09-22 15:56
閱讀 2136·2019-08-30 15:52
閱讀 1071·2019-08-30 14:13
閱讀 3487·2019-08-30 14:10