前言
在网站的开发过程当中,接口联调和测试是相当重要的一环,其直接影响产品的核心价值,而目前也有许多技术方案和工具加持,让咱们的开发测试工做更加便捷。接口做为数据传输的重要载体,数据格式和内容具备多样性,从宏观的角度上看,分为成功和失败,这两种状态又能够细分,例如失败对应的状态码有5**/4**,不一样的状态码表明的问题是不同的,都须要一一考虑,成功返回后,全部字段返回结果又是排列组合形式,那么问题就来了,是否能在条件允许的状况下快速覆盖全部的场景呢,从技术的角度上讲,问题不大,可是有时候成本却有点高,那怎么以一种低成本的方式快速实现呢,本文将围绕这个问题展开讨论,并尝试提供一种解决方案。前端
现状
前面说到了工做中遇到的接口测试场景,固然目前也有不少工具能够帮咱们实现接口的测试,如使用普遍的postman和fiddler等工具,功能强大,可安装插件或自定义脚本,解决数据测试的问题,好比咱们想要mock服务,参考https://learning.postman.com/docs/designing-and-developing-your-api/mocking-data/setting-up-mock/ 便可,网上也有不少使用教程,若是愿意花些时间的话,必定能给工做带来效率的提高,好吧,前提是你要花些时间。react
api-hook优点
1.开箱即用
有时候我只想简单修改一下接口数据,可是须要我安装软件,找教程捣腾半天,时间花费了,效率却下降了,api-hook引入项目中,经过简单配置(真的很简单)便可使用,全部操做所见即所得,没有学习成本;git
2.轻量方便
工具足够轻量,不须要另起服务,不须要单独维护,它就是你页面的一部分而已,你能够像控制一个div同样去控制它;github
工具介绍
1.)工具演示
功能说明 【1】是接口拦截/mock的切换区域,【2】能够关闭api-hook工具面板,【3】是工具面板显示/隐藏开关; 接口拦截
当工具面板可见且处于接口拦截模式下,全部发起ajax请求的接口返回页面前都会被拦截,当前处于编辑的接口处于接口请求列表第一位置,且背景有斑马线滚动动画,若是后续有其余接口响应被捕获,那么新的拦截接口处于编辑等待的状态,背景呈现淡蓝色,有底部位移动画提示。当接口编辑完成,点击【肯定】后,处于编辑等待状态的接口会自动切换成编辑模式,固然也能够自行切换。 接口mock
接口mock集成mockjs的功能,所以template配置可参考mockjs官网说明,这里须要说明的是template字段须要遵循JSON格式规范。ajax
2.)环境要求
该工具采用react开发,适用的项目也要求使用react技术框架;此外,工具会拦截全部ajax请求,所以确保你使用的接口请求是经过ajax发出的。npm
3.)使用方式
安装npm包 npm install api-hookjson
组件导入 在项目入口文件引入组件api
import ApiHook from 'api-hook'; function App() { return ( <div className="App"> <Main /> <ApiHook autoFilter defaultVisiable allowOrigins={['http://localhost:3000']} /> </div> ); } ...... ReactDOM.render( <React.StrictMode> <App /> </React.StrictMode> document.getElementById('root') );
4.)其余说明
支持响应类型 接口的响应类型目前只支持text/json,所以接口若是是document
,blob
,arraybuffer
等类型,则工具不作处理;数组
组件参数 |属性|说明|默认值| |---|---|---| |autoFilter |是否默认拦截接口 | false| |defaultVisiable |工具面板是否默承认见 |false | |allowOrigins |允许开启工具功能的站点,为数组类型,只有配置此项,才能在项目中使用工具 | |框架
研发介绍
1.)流程设计
工具提供了两种模式,接口mock和接口拦截,不一样的模式内部流程稍有不一样,具体以下: 接口拦截模式下,全部须要被拦截的接口响应都会被api-hook劫持,而不会对请求流程作任何处理。在工具提供的界面上能够修改响应状态码和接口的具体内容,在接口mock模式下,就是经过mockjs实现数据的模拟,mockjs经过自定义MockXMLRequest代理全部匹配请求,实现数据的响应。
2.)XMLHttpRequest代理
因为须要修改XMLHttpRequest的默认行为,所以项目代码实际访问的是其代理对象,在接口拦截/mock下,都是重写XMLHttpRequest对象,具体实现经过ajax-hook和mockjs来实现,接下来咱们探究一下其中原理; ajax-hook 在接口拦截模式,经过ajax-hook提供接口代理XMLHttpRequest原生对象,监听全部原生xhr对象属性,确保ajax-hook回调先执行,其次是ajax请求的回调;
XMLHttpRequest = function () { var xhr = new window[realXhr]; for (var attr in xhr) { var type = ""; try { type = typeof xhr[attr] } catch (e) { } if (type === "function") { // hookAjax methods of xhr, such as `open`、`send` ... this[attr] = hookFunction(attr); } else { Object.defineProperty(this, attr, { get: getterFactory(attr), set: setterFactory(attr), enumerable: true }) } } ...... }
mockjs mockjs将原生XMLHttpRequest保存在window._XMLHttpRequest属性上,声明一个MockXMLHttpRequest对象,该对象模拟了XMLHttpRequest的行为和方法,当咱们使用Mock.mock(...)api时,执行window.XMLHttpRequest = XHR;这里XHR就是MockXMLHttpRequest;
代理对象切换 工具在不一样模式下,使用不一样的代理对象,在切换拦截和mock的时候,须要执行重置原生XMLHttpRequest和初始化代理对象;
// mock模式 registerMock() { unProxy(); // 解除ajax-hook代理 const { mockList } = this.state; mockList.forEach(({ url, template }) => { Mock.mock(url, template); // mock注册 }); } // 拦截模式 unRegisterMock() { if (window._XMLHttpRequest) { // mock代理,重置原生ajax对象 window.XMLHttpRequest = window._XMLHttpRequest; } ajaxProxy(); // 启用ajax-hook代理 }
最后
该工具可供前端开发人员和测试人员使用,力求提供一种更便捷的方式去实现数据的个性化修改。这次只推出了基础功能,后续还将加入更多新特性,本仓库地址:https://github.com/lanpangzi-zkg/api-hook ,若是以为还行就点个star吧,有问题欢迎交流。