博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Fly.js 拦截全局 Ajax 请求
阅读量:5964 次
发布时间:2019-06-19

本文共 2046 字,大约阅读时间需要 6 分钟。

大多数情况下,我们的 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为真正的XMLHttpRequestfly.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 即可。

其它拦截方法

笔者曾经写过一个专门用于拦截ajax的库,Github地址 它也可以拦截全局的的ajax请求,不同的是,它可以拦截ajax请求的每一步,每一个回调,不仅强大,而且也很轻量(1KB)。和上面通过 fly engine 拦截的方式相比 ,Ajax-hook的拦截粒度更细,但Ajax-hook由于使用了ES5的 gettersetter,所以不支持IE9以下的浏览器。

最后

Fly刚刚开源,如果你觉得对您有用,欢迎star,多谢支持 github:

转载地址:http://eojax.baihongyu.com/

你可能感兴趣的文章
笔记纪录
查看>>
九、oracle 事务
查看>>
Git - 操作指南
查看>>
正则表达式的贪婪与非贪婪模式
查看>>
SqlServer存储过程调用接口
查看>>
DOM
查看>>
通过jQuery.support看javascript中的兼容性问题
查看>>
NYOJ-取石子
查看>>
AngularJS
查看>>
《zw版·Halcon-delphi系列原创教程》halconxlib控件列表
查看>>
代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能
查看>>
【云栖大会】阿里云移动云Apsara Mobile重磅发布 推出Cloud Native App全新研发范式...
查看>>
【PMP】Head First PMP 学习笔记 第九章 人力资源管理
查看>>
2015年末必备前端工具集
查看>>
【Solidity】8. 杂项 - 深入理解Solidity
查看>>
关于在VS2005中编写DLL遇到 C4251 警告的解决办法
查看>>
Go语言大神亲述:历七劫方可成为程序员!
查看>>
CYQ.Data 轻量数据层之路 V4.5 版本发布[更好的使用体验,更优的缓存机制]
查看>>
NetApp针对其集群化方案“不值得升级”言论回击Wikibon
查看>>
QQ把游戏放进聊天框,这一点Facebook和微信都没做到
查看>>