开源一款好用的AJAX和FETCH拦截器
因为手里的一个项目需要获取一个第三方软件的数据,但是他们不提供数据库的直接访问,且其提供的api接口能力有限,于是只好另辟蹊径,通过浏览器扩展插件进行web请求和响应的拦截。
大致思路如下:
通过浏览器扩展插件技术将做了monkey patch的ajax和fetch脚本注入到需要拦截web请求和响应的页面,那么这个页面上的window下原有的XMLHttpRequest和fetch便会被我们修改过的ajax和fetch替代。结果页面上的每个ajax和fetch请求和响应都会先通过我们挂载的拦截器函数的处理,然后在发送出去或者接收回页面。
这个思路是通用的,适用于一切的可以加载chrome扩展的web应用。当然,我想如果App在打包时可以注入用于拦截的javascript到webkit浏览器,也是可以进行web请求拦截的。
开源的代码在我的gitee仓库下。(点这里访问)本项目以MIT许可开放。
这只是解决了ajax,还有fetch的需要处理。这部分只好自己手搓一个了。
核心代码在src\fetch.js中。
使用方式如下:
1. 安装- 下载这个git仓库。- 运行 `npm run build`- 拦截ajax, 需要使用`dist`目录下的`ajaxhook.ming.js`.```html<script src="dist/ajaxhook.min.js"></script>```- 拦截fetch需要使用`dist`下的`fetchhook.ming.js`.```html<script src="dist/ajaxhook.min.js"></script>```2. 使用- 用`proxy`拦截ajax:```javascriptah.proxy({//请求发起前进入onRequest: (config, handler) => {console.log(config.url)handler.next(config);},//请求成功后进入onResponse: (response, handler) => {console.log(response.response)handler.next(response)},//请求发生错误时进入,比如超时;注意,不包括http状态码错误,如404仍然会认为请求成功onError: (err, handler) => {console.log(err.type)handler.next(err)}})```- 用`hookFetch`拦截fetch:```javascriptfh.hookFetch({requestInterceptors: {// input is usually url, init is of Request entity.itc1: function (input, init){ .... do somethingreturn init },itc2: function (input, init){ .... do somethingreturn init },},responseInterceptors: {// input is usually url, interceptorRes is of Response body.itc3: function (input, interceptorRes){ .... do somethingreturn interceptorRes },itc4: function (input, interceptorRes){ .... do somethingreturn interceptorRes },}})
欢迎下载ajax-fetch-interceptor使用,也欢迎提交Pull Request。
