Fly拦截全局Ajax请求的方法

所属分类: 网络编程 / AJAX相关 阅读数: 1685
收藏 0 赞 0 分享

大多数情况下,我们的 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

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

更多精彩内容其他人还在看

AJAX 客户端响应速度提高分析

AJAX的出现极大的改变了Web应用客户端的操作模式,它使的用户可以在全心工作时不必频繁的忍受那令人厌恶的页面刷新。
收藏 0 赞 0 分享

揭开AJAX神秘的面纱(AJAX个人学习笔记)第1/5页

写这个学习笔记,只是记载一下自己的学习经过和体会,把一些学习重点记录下来,以备今后的巩固复习及应用,很多知识点没有详细介绍,所以并不完全适用于初学者,如果你是初学者,最好选择一本AJAX学习的书籍,然后与这篇学习笔记对照学习,效果会更好。
收藏 0 赞 0 分享

Ajax Control Toolkit 34个服务器端控件第1/2页

Ajax Control Toolkit 34个服务器端控件,想要学习ajax的朋友可以参考下。
收藏 0 赞 0 分享

Ajax 核心框架函数及例子

最近学习js,肯定会学到ajax中的东西,所以,看到比较好的ajax函数,免不得要贴出来,供大家参考。这个函数摘录自john resig的书中。
收藏 0 赞 0 分享

AJAX 进度条实现代码

AJAX 进度条实现代码,基于java后来,大家可以学习下。
收藏 0 赞 0 分享

一款经典的ajax登录页面 后台asp.net

众所周知,用服务器控件做页面的登录窗体时很简单的,但是页面的多次回传让我们感觉到头痛,一直刷新页面的感觉非常之不好,其实用ajax的局部刷新功能可以完全解决这个问题,制作出来的页面有很好的交互性,而且是局部刷新,节省网络资源。
收藏 0 赞 0 分享

ajax 调用后台方法大家可以讨论下

我曾使用过的三种调用后台的代码,需要的朋友可以参考下,如果发现更好的可以留言。
收藏 0 赞 0 分享

5款Ajax 文件上传控件

如果你的网站含有文件上传功能,那可以使用本文介绍的5款Ajax文件上传控件,提升用户体验。要知道,上传文件总是个痛苦的过程,要消除不太现实,但至少如果你为减少用户的痛苦努力了,那用户也会喜欢你的网站的。
收藏 0 赞 0 分享

AJAX集天气\IP\多国语言翻译MP3(可同步LRC歌词显示)\万年历查询通

AJAX集天气\IP\多国语言翻译MP3(可同步LRC歌词显示)\万年历查询通
收藏 0 赞 0 分享

AJAX 缓存问题的两种解决方法(IE)

ajax 清除缓存的两种方法
收藏 0 赞 0 分享
查看更多