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',// 此处为 raw
    raw: JSON.stringify(
        // 这里和自己的后端项目需要的格式对应
        {
            "userName": username,
            "password": password
            
        }
        ), // 序列化后的 json 字符串
    }
    };
    // 发送请求。
    // pm.sendrequest 参考文档: https://www.apifox.cn/help/app/scripts/api-references/pm-reference/#pm-sendrequest
    pm.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-cookies
    const jsonData = res.json();
    console.log(jsonData);
    // 将 accessToken 写入环境变量 ACCESS_TOKEN
    pm.environment.set("ACCESS_TOKEN", jsonData.token);
    /*
        这里由于我请求的后端项目的Token过期期间返回的是秒,所以需要处理一下,变为毫秒
        所以过期期间为:当前时间+有效毫秒
    */
    // 将 accessTokenExpires 过期时间写入环境变量 ACCESS_TOKEN_EXPIRES
    pm.environment.set(
    "ACCESS_TOKEN_EXPIRES",
    new Date().getTime()+(jsonData.expire*1000)
    );
    }
    });
    }
    // 获取全局变量里的 ACCESS_TOKEN
    const accessToken = pm.globals.get("ACCESS_TOKEN");
    // 获取全局变量里的 ACCESS_TOKEN_EXPIRES
    const 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












![成功解决[!] CocoaPods could not find compatible versions for pod “sqflite“](https://img-blog.csdnimg.cn/direct/a53e7a685c7d48b59b0317669cf9d0cb.png)






