APIFox-自动获取登录状态操作
概述
作为纯后端开发码农,每次接口开发完的调试很重要,因此每次重复的手动获取登陆状态Token或者直接放行就太麻烦了。
APIFox提供了前置操作,可以很方便的自动获取登录状态,节省大量重复劳动时间。
APIFox中的变量
APIFox中的变量有全局变量、环境变量与临时变量,其中常用的是全局变量和环境变量。
详情参考:https://zhuanlan.zhihu.com/p/550921426?utm_id=0
- 全局变量:存放不同环境请求中共同需要的变量参数。
全局变量操作:pm.globals.get/set
- 环境变量:存放各自环境不同的变量参数。
环境变量操作:pm.environment.get/set
注意:APIFox中还有许多内置变量(不用用户自己创建),如
BASE_URL
,通过该变量可以获取不同环境下的前置URL。
具体操作
仅供参考,需要根据自己的项目,微调。
我这里的后端项目登录接口是返回Token与过期时间间隔(秒),具体设置操作如下。
1. 创建变量
- 由于我的开发环境(本地)与测试环境的用户名和密码是一样的,所以我将其添加到了全局变量。
- 由于我这里 开发环境(本地)后端项目与测试环境后端项目 使用的是同一个数据库,因此当切换环境后,会由于再次请求(再次请求因为另一个环境中的Token变量可能是空的或者过期了)而造成原本环境的Token失效(因为是共用一个数据库,原来的Token在后端由于再次登录被更新了)。所以,我这里将Token变量与过期时间间隔(秒)变量也放在了全局变量中。
2. 创建公共请求头
由于本后端项目的Token是放在每次请求的Header中的,所以我将获取到的Token变量直接放到这里。另外,该项目前后端都是JSON格式,所以也加上了Content-type,并定义为JSON格式。
3. 创建公共脚本
自己看注释,自行根据自己的项目微调。
// 定义发送登录接口请求方法
function sendLoginRequest() {// 获取环境里的 前置URL - 这是默认内置的变量,无需手动设置const baseUrl = pm.environment.get("BASE_URL");/*全局变量操作:pm.globals.get/set环境变量操作:pm.environment.get/set参考APIFOX变量操作:https://zhuanlan.zhihu.com/p/550921426?utm_id=0*///由于我的开发环境(本地)与测试环境的用户名和密码是一样的,所以我将其添加到了全局变量// 登录用户名,这里从全局变量 LOGIN_USERNAME 获取,也可以写死(但是不建议)const username = pm.globals.get("LOGIN_USERNAME");// 登录用户名,这里从全局变量 LOGIN_PASSWORD 获取,也可以写死(但是不建议)const password = pm.globals.get("LOGIN_PASSWORD");// 构造一个 POST x-www-form-urlencoded 格式请求。这里需要改成你们实际登录接口的请求参数。const loginRequest = {url: baseUrl + "/sys/login",method: "POST",// body 为 json 格式header: {"Content-Type": "application/json"// 注意:header 需要加上 Content-Type},body: {mode: 'raw',// 此处为 rawraw: JSON.stringify(// 这里和自己的后端项目需要的格式对应{"userName": username,"password": password}), // 序列化后的 json 字符串}};// 发送请求。// pm.sendrequest 参考文档: https://www.apifox.cn/help/app/scripts/api-references/pm-reference/#pm-sendrequestpm.sendRequest(loginRequest, function (err, res) {if (err) {console.log(res);console.log(err);} else {// 读取接口返回的 json 数据。// 如果你的 token 信息是存放在 cookie 的,可以使用 res.cookies.get('token') 方式获取。// cookies 参考文档:https://www.apifox.cn/help/app/scripts/api-references/pm-reference/#pm-cookiesconst jsonData = res.json();console.log(jsonData);// 将 accessToken 写入环境变量 ACCESS_TOKENpm.environment.set("ACCESS_TOKEN", jsonData.token);/*这里由于我请求的后端项目的Token过期期间返回的是秒,所以需要处理一下,变为毫秒所以过期期间为:当前时间+有效毫秒*/// 将 accessTokenExpires 过期时间写入环境变量 ACCESS_TOKEN_EXPIRESpm.environment.set("ACCESS_TOKEN_EXPIRES",new Date().getTime()+(jsonData.expire*1000));}});}// 获取全局变量里的 ACCESS_TOKENconst accessToken = pm.globals.get("ACCESS_TOKEN");// 获取全局变量里的 ACCESS_TOKEN_EXPIRESconst accessTokenExpires = pm.globals.get("ACCESS_TOKEN_EXPIRES");/*由于我这里 开发环境(本地)后端项目与测试环境后端项目 使用的是同一个数据库,因此当切换环境后,会由于再次请求(再次请求因为另一个环境中的Token变量可能是空的或者过期了)而造成原本环境的Token失效(因为是一个数据库,原来的Token在后端由于再次登录被更新了)。解决方式:开发环境(本地)与测试环境 的 Token变量与过期时间间隔变量 改变位置存放在全局变量,开发环境与测试环境共用。*/// 如 ACCESS_TOKEN 没有值,或 ACCESS_TOKEN_EXPIRES 已过期,则执行发送登录接口请求if (!accessToken ||(new Date(accessTokenExpires) <= new Date())){sendLoginRequest();}
4. 为项目根目录添加前置脚本
我这里的项目是单体项目,因此子接口直接继承父目录的设置就好了。
参考博文
https://apifox.com/blog/cookies-and-token/
https://zhuanlan.zhihu.com/p/550921426?utm_id=0
https://apifox.com/help/environment-and-variables/environment-management
https://blog.csdn.net/sinat_15872851/article/details/128842095