Fly拦截全局Ajax请求的方法
大多数情况下,我们的 ajax 请求都是通过前端的开发库、框架发出的,如 jquery、axios 或者 fly。这些库自身都会有一些请求/响应钩子,用于预处理 ajax请求和响应。但是,如果你没有使用这些网络库,又或是你并不是网页的开发者,而你需要分析某个网页的所有ajax请求,又或是你是一个应用开发者,你的webview中需要拦截所有网页的网络请求(网页并不是你开发的)…… 这种时候,你就需要拦截全局的 ajax 请求.
原理
无论你的应用是通过那个框架或库发起的 ajax 请求,最终都会回归到 xmlhttprequest 。 所以,拦截的本质就是替换浏览器原生的 xmlhttprequest 。具体就是,在替换之前保存先保存 xmlhttprequest,然后在请求过程中根据具体业务逻辑决定是否需要发起网络请求,如果需要,再创建真正的 xmlhttprequest 实例。
fly 拦截全局ajax
如果您还不了解 fly, 请参考其官网:
我们知道,在 fly 中,xmlhttprequest 就是一个。所以我们要拦截,只需要自定义一个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:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 这只苍蝇 我收养了
推荐阅读