• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Fly拦截全局Ajax请求的方法
    POST TIME:2021-10-18 05:54

    大多数情况下,我们的 Ajax 请求都是通过前端的开发库、框架发出的,如 jQuery、axios 或者 Fly。这些库自身都会有一些请求/响应钩子,用于预处理 Ajax请求和响应。但是,如果你没有使用这些网络库,又或是你并不是网页的开发者,而你需要分析某个网页的所有Ajax请求,又或是你是一个应用开发者,你的webview中需要拦截所有网页的网络请求(网页并不是你开发的)…… 这种时候,你就需要拦截全局的 Ajax 请求.

    原理

    无论你的应用是通过那个框架或库发起的 Ajax 请求,最终都会回归到 XMLHttpRequest 。 所以,拦截的本质就是替换浏览器原生的 XMLHttpRequest 。具体就是,在替换之前保存先保存 XMLHttpRequest,然后在请求过程中根据具体业务逻辑决定是否需要发起网络请求,如果需要,再创建真正的 XMLHttpRequest 实例。

    Fly 拦截全局ajax

    如果您还不了解 fly, 请参考其官网:https://wendux.github.io/dist/#/doc/flyio/readme

    我们知道,在 Fly 中,XMLHttpRequest 就是一个http engine。所以我们要拦截,只需要自定义一个engine替换掉全局的XMLHttpRequest 就行,而 Fly 提供了快速生成 engine 的工具,所以我们可以很方便实现拦截。

    我们先看一个简单的例子,功能是输出每次网络请求 url 和 method。

    实现

     var log = console.log;
    //切换fly engine为真正的XMLHttpRequest
    fly.engine = XMLHttpRequest;
    var engine = EngineWrapper(function (request, responseCallback) {
      console.log(request.url, request.method)
      //发起真正的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 发起一个请求测试一下:

    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中的网络请求都是通过真正的 XMLHttpRequest 发起的 (事实上, 浏览器环境下 fly 默认的 engine本就是 XMLHttpRequest,无需手动切换,此处为了清晰,故手动切换了一下)。fly 会根据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

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • 在小程序/mpvue中使用flyio发起网络请求的方法
    • mpvue中使用flyjs全局拦截的实现代码
    • 基于jquery fly插件实现加入购物车抛物线动画效果
    上一篇:浅析IE浏览器关于ajax的缓存机制
    下一篇:Ajax引擎 ajax请求步骤详细代码
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信