成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Js 攔截全局ajax請(qǐng)求

plokmju88 / 551人閱讀

摘要:卸載攔截卸載后,攔截將失效。最后測(cè)一下輸出注意攔截函數(shù)返回值是一個(gè),如果為則會(huì)阻斷請(qǐng)求,默認(rèn)為不會(huì)阻斷請(qǐng)求。

你是否有過下面的需求:需要給所有ajax請(qǐng)求添加統(tǒng)一簽名、需要統(tǒng)計(jì)某個(gè)接口被請(qǐng)求的次數(shù)、需要限制http請(qǐng)求的方法必須為get或post、需要分析別人網(wǎng)絡(luò)協(xié)議等等,那么如何做?想想,如果能夠攔截所有ajax請(qǐng)求,那么問題就會(huì)變的很簡(jiǎn)單!?,少年,想法有點(diǎn)大膽,不過,我欣賞!直接上輪子,Ajax-hook不僅可以滿足你想要的,同時(shí)可以給你更多。

本博客原始地址:http://www.jianshu.com/p/9b634f1c9615
Ajax-hook源碼地址 : https://github.com/wendux/Ajax-hook 歡迎star

如何使用 一. 直接引入腳本

引入ajaxhook.js

攔截需要的ajax 回調(diào)或函數(shù)。

hookAjax({
    //攔截回調(diào)
    onreadystatechange:function(xhr){
        console.log("onreadystatechange called: %O",xhr)
    },
    onload:function(xhr){
        console.log("onload called: %O",xhr)
    },
    //攔截函數(shù)
    open:function(arg){
     console.log("open called: method:%s,url:%s,async:%s",arg[0],arg[1],arg[2])
    }
})

ok, 我們使用jQuery(v3.1) 的get方法來測(cè)一下:

// get current page source code 
$.get().done(function(d){
    console.log(d.substr(0,30)+"...")
})

結(jié)果 :

> open called: method:GET,url:http://localhost:63342/Ajax-hook/demo.html,async:true
> onload called: XMLHttpRequest
> 
  
  

攔截成功了! 我們也可以看到j(luò)Query3.1內(nèi)部已經(jīng)放棄onreadystatechange而改用onload了。

二. CommonJs下的模塊構(gòu)建工具環(huán)境中

假設(shè)在webpack下,第一步, 安裝ajax-hook npm插件

npm install ajax-hook --save-dev

第二步,引入模塊并調(diào)用api:

const ah=require("ajax-hook")
ah.hookAjax({ 
  onreadystatechange:function(xhr){ ... },
  onload:function(xhr){ ... }, 
  ...
})
...
ah.unHookAjax()
API hookAjax(ob)

ob,類型是對(duì)象,key為想要攔截的回調(diào)或函數(shù),value為我們的攔截函數(shù)。

返回值: 原始的 XMLHttpRequest。如果有寫請(qǐng)求不想被攔截,可以new 這個(gè)。

unHookAjax()

卸載攔截;卸載后,攔截將失效。

改變ajax行為

攔截所有ajax請(qǐng)求,檢測(cè)請(qǐng)求method,如果是“GET”,則中斷請(qǐng)求并給出提示

hookAjax({
  open:function(arg){
    if(arg[0]=="GET"){
      console.log("Request was aborted! method must be post! ")
      return true;
    }
  } 
 })

攔截所有ajax請(qǐng)求,請(qǐng)求統(tǒng)一添加時(shí)間戳

hookAjax({
  open:function(arg){
    arg[1]+="?timestamp="+Date.now();
  } 
 })

修改請(qǐng)求返回的數(shù)據(jù)“responseText”

hookAjax({
   onload:function(xhr){
    //請(qǐng)求到的數(shù)據(jù)首部添加"hook!" 
    xhr.responseText="hook!"+xhr.responseText;
   }
 })

結(jié)果:

hook!


有了這些示例,相信開篇提到的需求都很容易實(shí)現(xiàn)。最后測(cè)一下unHook

   hookAjax({
        onreadystatechange:function(xhr){
            console.log("onreadystatechange called: %O",xhr)
            //return true

        },
        onload:function(xhr){
            console.log("onload called")
            xhr.responseText="hook"+xhr.responseText;
            //return true;
        },
        open:function(arg){
          console.log("open called: method:%s,url:%s,async:%s",arg[0],arg[1],arg[2])
          arg[1]+="?hook_tag=1";

        },
        send:function(arg){
         console.log("send called: %O",arg[0])
        }
    })

    $.get().done(function(d){
        console.log(d.substr(0,30)+"...")
        //use original XMLHttpRequest
        console.log("unhook")
        unHookAjax()
        $.get().done(function(d){
            console.log(d.substr(0,10))
        })

    })

輸出:

open called: method:GET,url:http://localhost:63342/Ajax-hook/demo.html,async:true
send called: null
onload called
hook


注意

攔截函數(shù)返回值是一個(gè)boolean,如果為true則會(huì)阻斷ajax請(qǐng)求,默認(rèn)為false,不會(huì)阻斷請(qǐng)求。

所有的回調(diào)攔截函數(shù)的參數(shù)為當(dāng)前的XMLHttpRequest 實(shí)例,如onreadystatechange、onload;所有ajax原始方法的攔截函數(shù)會(huì)將原始參數(shù)以數(shù)組的形式傳遞給攔截函數(shù),你可以在攔截函數(shù)中修改它。

相關(guān)鏈接:
Ajax-hook原理解析:http://www.jianshu.com/p/7337ac624b8e

BY THE WAY : 歡迎關(guān)注、star我的另一個(gè)開源項(xiàng)目 fly.js ! ?。

最后還是老話:剛開博客,求贊、求關(guān)注、求評(píng)論、各種求。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90073.html

相關(guān)文章

  • http.jsAjax單頁面中的應(yīng)用

    摘要:發(fā)送全局參數(shù)我做單頁面應(yīng)用時(shí),會(huì)有這樣一個(gè)情景當(dāng)用戶登錄后,服務(wù)器會(huì)返回一個(gè)值,之后的大部分請(qǐng)求都需要傳遞這個(gè)參數(shù)。因此,我在中增加這樣一個(gè)函數(shù)來解決上面的問題。 關(guān)于作者 馬隆博(Lenbo Ma),Java,Javascript Blog: http://mlongbo.com E-Mail: [email protected] 文章編寫于: 2014/08/10 轉(zhuǎn)載請(qǐng)注明出...

    DC_er 評(píng)論0 收藏0
  • 淺談使用 Vue 構(gòu)建前端 10w+ 代碼量的單頁面應(yīng)用開發(fā)底層

    摘要:其實(shí)就是我們開始掛載上去的我們?cè)谶@里出去,我們就可以在回調(diào)里面只處理我們的業(yè)務(wù)邏輯,而其他如斷網(wǎng)超時(shí)服務(wù)器出錯(cuò)等均通過攔截器進(jìn)行統(tǒng)一處理。 showImg(https://segmentfault.com/img/remote/1460000015472616?w=845&h=622); 開始之前 隨著業(yè)務(wù)的不斷累積,目前我們 ToC 端主要項(xiàng)目,除去 node_modules, bu...

    rickchen 評(píng)論0 收藏0
  • 淺談使用 Vue 構(gòu)建前端 10w+ 代碼量的單頁面應(yīng)用開發(fā)底層

    摘要:其實(shí)就是我們開始掛載上去的我們?cè)谶@里出去,我們就可以在回調(diào)里面只處理我們的業(yè)務(wù)邏輯,而其他如斷網(wǎng)超時(shí)服務(wù)器出錯(cuò)等均通過攔截器進(jìn)行統(tǒng)一處理。 showImg(https://segmentfault.com/img/remote/1460000015472616?w=845&h=622); 開始之前 隨著業(yè)務(wù)的不斷累積,目前我們 ToC 端主要項(xiàng)目,除去 node_modules, bu...

    Backache 評(píng)論0 收藏0
  • JS HTTP 請(qǐng)求終極解決方案 - fly.js

    摘要:支持請(qǐng)求響應(yīng)攔截器。定位與目標(biāo)的定位是成為請(qǐng)求的終極解決方案。攔截器支持請(qǐng)求響應(yīng)攔截器,可以通過它在請(qǐng)求發(fā)起之前和收到響應(yīng)數(shù)據(jù)之后做一些預(yù)處理。 Fly.js 是一個(gè)功能強(qiáng)大的輕量級(jí)的javascript http請(qǐng)求庫,同時(shí)支持瀏覽器和node環(huán)境,通過適配器,它可以運(yùn)行在任何具有網(wǎng)絡(luò)能力的javascript運(yùn)行環(huán)境;同時(shí)fly.js有一些高級(jí)的玩法如全局ajax攔截、在web a...

    OpenDigg 評(píng)論0 收藏0
  • JS實(shí)現(xiàn)監(jiān)控微信小程序

    摘要:博客地址使用模塊化工具打包自己開發(fā)的庫文章中有提到,當(dāng)時(shí)需要寫一個(gè),監(jiān)控小程序的后臺(tái)接口調(diào)用和頁面報(bào)錯(cuò),今天就來說下實(shí)現(xiàn)原理吧原理之前也做過瀏覽器端的數(shù)據(jù)埋點(diǎn)上報(bào),其實(shí)原理大同小異通過劫持原始方法,獲取需要上報(bào)的數(shù)據(jù),最后再執(zhí)行原始方法,這 博客地址 《使用模塊化工具打包自己開發(fā)的JS庫》文章中有提到,當(dāng)時(shí)需要寫一個(gè)SDK,監(jiān)控小程序的后臺(tái)接口調(diào)用和頁面報(bào)錯(cuò),今天就來說下實(shí)現(xiàn)原理吧! ...

    Cheriselalala 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<