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();
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐