Apifox中更新token的两种方式(手动、自动)

发布时间 2023-04-15 09:24:28作者: 风吹稻香

Apifox 关于token的使用方式
前言,关于token的使用,仅做了简单的demo测试token效果。

1.手动登录获取token
顾名思义,因为只有登录之后才有token的信息,所以在调用其他接口前需要拥有token才能访问。

操作步骤
1)添加全局变量、参数
在右上角环境中配置详细信息:全局参数填写参数名以及默认值
{{token}},并且在全局变量中也可以填写token值。优先级就很高了。

接着在全局变量中也填写对应的本地值。

2)在登录接口运行中添加后置操作
选择提取变量,将token填入,并且根据登录接口返回的数据结构获取对应的token。例如我这里就是data.token。

添加完毕后,就会把登录接口返回的token数据填充到全局变量和全局参数中。但至此还不能实现:登录过后,其他的接口都可以调用了。要执行第3步。

特别注意:后置操作不是在接口文档中保存的,所以获取token的后置操作要保存用例,下次运行用例才能将token填充到全局变量中去。

3)在项目概览中添加Auth
点击项目概览,下方有Auth,目前我使用过API Key 和 Bearer Token。效果都一样,也是将{{token}}填入就好了,这样就是动态的获取全局变量中的token。


4)测试效果
首先是不登录时,调用其他接口的返回状态:

因为之前登陆过,但是token过期了,所以会提示token过期的信息。然后再执行一次登录接口,再观察控制台结果:在控制台可以很清晰的看到全局变量重新填充了。

然后回到其他接口调用:没有发生拦截,成功的执行了接口。


2.自动获取token
自动获取token的方式相对手动获取来说也就是多了一步前置操作,意思就是在调用任意接口前,先执行一次登录接口将token填充到全局变量中,从而避免了token过期或需要手动调用登录接口再调用其他接口

操作步骤
1)新建公共脚本
在项目设置中添加公共脚本:

 

该脚本的主体就是pm.sendRequest(),意思就是调用一次登录接口,其参数也就是接口中所需要的参数,此处都是模拟数据,真实可按照数据库中的账户密码即可。

特别注意:其实不推荐这样写死的url和账户密码、文章末尾有一份比较标准的脚本,参考了官方文档。

2)在项目概览中添加前置操作
只要根据提示就可以把脚本给添加到前置操作中。保存后就可以测试结果了。


3)测试效果

目前接口任然处于一个token过期的状态,但这次不再手动调用登录接口了,而是直接再次运行此接口:


可以看到接口也运行成功,并没有拦截。此时,我们可以通过点击控制台的链接,发现此处就是默认执行了一次登录的接口,所以token也就不会存在过期、或不存在的情况了。


脚本模板
// body 里面的参数需要自己设置对应的
// 定义发送登录接口请求方法
function sendLoginRequest() {
// 获取环境里的 前置URL
// const baseUrl = pm.environment.get('BASE_URL');
// 登录用户名,这里从环境变量 LOGIN_USERNAME 获取,也可以写死(但是不建议)
// const username = pm.environment.get('LOGIN_USERNAME');
// 登录用户名,这里从环境变量 LOGIN_PASSWORD 获取,也可以写死(但是不建议)
// const password = pm.environment.get('LOGIN_PASSWORD');
// 构造一个 POST x-www-form-urlencoded 格式请求。这里需要改成你们实际登录接口的请求参数。
const loginRequest = {
url: 'http://localhost:8888/customer/login',
method: 'POST',
// 若 body 为 x-www-form-urlencoded 格式,mode 为 'urlencoded'
// body: {
// mode: 'urlencoded',
// urlencoded: [
// { key: 'account', value: username },
// { key: 'password', value: password }
// ]
// }
// 若 body 为 form-data 格式,mode 为 'formdata'
// body: {
// mode: 'formdata',
// formdata: [
// { key: 'account', value: username },
// { key: 'password', value: password }
// ]
// }
// 若 body 为 raw 或 json 格式,mode 为 'raw'
header: 'Content-Type:application/json',
body: {
mode: 'raw',
raw: JSON.stringify(
{
"loginAccount":"lisi",
"password":"123456"
})
}
};
// 发送请求。
// pm.sendrequest 参考文档: https://www.apifox.cn/help/app/scripts/api-references/pm-reference/#pm-sendrequest
pm.sendRequest(loginRequest, function (err, response) {
if (err) {
console.log(err);
} else {
// 读取接口返回的 json 数据。
// 如果你的 token 信息是存放在 cookie 的,可以使用 res.cookies.get('token') 方式获取。
// cookies 参考文档:https://www.apifox.cn/help/app/scripts/api-references/pm-reference/#pm-cookies
const res = response.json();
// 将 accessToken 写入环境变量 ACCESS_TOKEN
pm.globals.set('token', res.data.token);
}
});
}
// 获取全局变量里的 TOKEN
// const token = pm.globals.get('token');
// 获取环境变量里的 ACCESS_TOKEN_EXPIRES
// const accessTokenExpires = pm.environment.get('ACCESS_TOKEN_EXPIRES');
// 如 ACCESS_TOKEN 没有值,或 ACCESS_TOKEN_EXPIRES 已过期,则执行发送登录接口请求
// if (!token) {
// sendLoginRequest();
// }
//测试:不进行任何判断,调用其他接口前先调用登录接口
sendLoginRequest();
————————————————
版权声明:本文为CSDN博主「你不要害怕」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_53021672/article/details/125643067