Fly.js攔截全局Ajax請求

fly.png

大多數(shù)情況下,我們的 Ajax 請求都是通過前端的開發(fā)庫蹭沛、框架發(fā)出的辽剧,如 jQuery送淆、axios 或者 Fly。這些庫自身都會有一些請求/響應鉤子怕轿,用于預處理 Ajax請求和響應偷崩。但是,如果你沒有使用這些網(wǎng)絡庫撞羽,又或是你并不是網(wǎng)頁的開發(fā)者阐斜,而你需要分析某個網(wǎng)頁的所有Ajax請求,又或是你是一個應用開發(fā)者诀紊,你的webview中需要攔截所有網(wǎng)頁的網(wǎng)絡請求(網(wǎng)頁并不是你開發(fā)的)...... 這種時候谒出,你就需要攔截全局的 Ajax 請求.

原理

無論你的應用是通過那個框架或庫發(fā)起的 Ajax 請求,最終都會回歸到 XMLHttpRequest 邻奠。 所以笤喳,攔截的本質就是替換瀏覽器原生的 XMLHttpRequest 。具體就是碌宴,在替換之前保存先保存 XMLHttpRequest杀狡,然后在請求過程中根據(jù)具體業(yè)務邏輯決定是否需要發(fā)起網(wǎng)絡請求,如果需要唧喉,再創(chuàng)建真正的 XMLHttpRequest 實例捣卤。

Fly 攔截全局ajax

如果您還不了解 fly, 請參考其官網(wǎng):https://wendux.github.io/dist/#/doc/flyio/readme

我們知道忍抽,在 Fly 中八孝,XMLHttpRequest 就是一個 http engine董朝。所以我們要攔截,只需要自定義一個engine替換掉全局的XMLHttpRequest 就行干跛,而 Fly 提供了快速生成 engine 的工具子姜,所以我們可以很方便實現(xiàn)攔截。

我們先看一個簡單的例子楼入,功能是輸出每次網(wǎng)絡請求 url 和 method哥捕。

實現(xiàn)

 var log = console.log;
//切換fly engine為真正的XMLHttpRequest
fly.engine = XMLHttpRequest;
var engine = EngineWrapper(function (request, responseCallback) {
    console.log(request.url, request.method)
    //發(fā)起真正的ajax請求
    fly.request(request.url, request.data, request)
        .then(function (d) {
            responseCallback({
                statusCode: d.engine.status,
                responseText: d.engine.responseText,
                statusMessage: d.engine.statusText
            })
        })
        .catch(function (err) {
            responseCallback({
                statusCode:err.status,
                statusMessage:err.message
            })
        })
})
//覆蓋默認
XMLHttpRequest = engine;
axios.post("../package.json").then(log)

我們用 axios 發(fā)起一個請求測試一下:

axios.post("../package.json").then(log)

//控制臺輸出
> http://localhost:63341/Fly/package.json POST
> {data: {…}, status: 200, statusText: "OK", headers: {…}, config: {…}, …}

可以看到控制臺中輸出了請求的 url 和 method,我們的攔截成功了嘉熊。而 第二行的結果對象是axios then打印出的遥赚。

因為 Fly支持切換engine, 我們可以直接先將 fly engine 切換為真正的 XMLHttpRequest ,然后再覆蓋阐肤,這樣fly中的網(wǎng)絡請求都是通過真正的 XMLHttpRequest 發(fā)起的 (事實上凫佛, 瀏覽器環(huán)境下 fly 默認的 engine本就是 XMLHttpRequest,無需手動切換孕惜,此處為了清晰愧薛,故手動切換了一下)。fly 會根據(jù)request對象自動同步請求頭毫炉。如果想阻止請求,直接在 adapter 中 return 即可削罩。

其它攔截方法

Github上的開源庫 Ajax-hook 也可以攔截全局的的ajax請求,不同的是弥激,它可以攔截ajax請求的每一步,每一個回調秆撮,不僅強大,而且也很輕量(1KB)职辨。和上面通過 fly engine 攔截的方式相比 盗蟆,Ajax-hook的攔截粒度更細,但Ajax-hook由于使用了ES5的 getter舒裤、setter喳资,所以不支持IE9以下的瀏覽器。

最后

Fly剛剛開源腾供,如果你覺得對您有用仆邓,歡迎star鲜滩,多謝支持 github: https://github.com/wendux/fly

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市节值,隨后出現(xiàn)的幾起案子徙硅,更是在濱河造成了極大的恐慌,老刑警劉巖搞疗,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗓蘑,死亡現(xiàn)場離奇詭異,居然都是意外死亡匿乃,警方通過查閱死者的電腦和手機桩皿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幢炸,“玉大人泄隔,你說我怎么就攤上這事⊥鸹玻” “怎么了佛嬉?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岩调。 經(jīng)常有香客問我巷燥,道長,這世上最難降的妖魔是什么号枕? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任缰揪,我火速辦了婚禮,結果婚禮上葱淳,老公的妹妹穿的比我還像新娘钝腺。我一直安慰自己,他們只是感情好赞厕,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布艳狐。 她就那樣靜靜地躺著,像睡著了一般皿桑。 火紅的嫁衣襯著肌膚如雪毫目。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天诲侮,我揣著相機與錄音镀虐,去河邊找鬼。 笑死沟绪,一個胖子當著我的面吹牛刮便,可吹牛的內容都是我干的。 我是一名探鬼主播绽慈,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼恨旱,長吁一口氣:“原來是場噩夢啊……” “哼辈毯!你這毒婦竟也來了?” 一聲冷哼從身側響起搜贤,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎管毙,沒想到半個月后桌硫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啃炸,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年膀钠,在試婚紗的時候發(fā)現(xiàn)自己被綠了肿嘲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筑公。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖封救,靈堂內的尸體忽然破棺而出捣作,到底是詐尸還是另有隱情,我是刑警寧澤券躁,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站以舒,受9級特大地震影響搪泳,放射性物質發(fā)生泄漏。R本人自食惡果不足惜奋刽,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佣谐。 院中可真熱鬧,春花似錦罚攀、人聲如沸雌澄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至募胃,卻和暖如春畦浓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祷嘶。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工抹蚀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人环壤。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像接箫,于是被迫代替她去往敵國和親朵诫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內容

  • Fly.js 是一個功能強大的輕量級的javascript http請求庫邓梅,同時支持瀏覽器和node環(huán)境日缨,通過適配...
    lazydu閱讀 20,877評論 2 11
  • 這是fly的第二篇文章掖看,主要是將fly和axios進行一個全面的對比。 首先感謝大家支持哎壳,在fly的第一篇文章 J...
    lazydu閱讀 4,882評論 0 3
  • 你是否有過下面的需求:需要給所有ajax請求添加統(tǒng)一簽名耳峦、需要統(tǒng)計某個接口被請求的次數(shù)焕毫、需要限制http請求的方法...
    lazydu閱讀 44,294評論 30 53
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,114評論 25 707
  • 帝都的秋邑飒,何必上香山 這叫啥名字植物我不稀飯
    東閣戚十三閱讀 178評論 0 0