APIFox-自动获取登录状态操作

news/2024/6/4 0:17:14 标签: apifox, 接口测试, 前后端分离

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


http://www.niftyadmin.cn/n/5394634.html

相关文章

Prompt 编程的优化技巧

一、为什么要优化 一&#xff09;上下文限制 目前 GPT-3.5 以及 GPT-4最大支持 16K 上下文&#xff0c;比如你输入超过 16k 的长文本&#xff0c;ChatGPT 会提示文本过大&#xff0c;为了避免 GPT 无法回复&#xff0c;需要限制 上下文在16k 以内 上下文对于 GPT 来说是非常重…

webpack 如何实现模块懒加载

首先在打包的时候使用 splitwebpackplugin 进行分割 在实际引用中&#xff0c;webpack 实现模块的懒加载是通过动态导入&#xff08;dynamic import &#xff09;来实现的。动态导入是 es6 的一项功能&#xff0c;允许在运行时异步加载模块&#xff0c;从而实现按需加载。 使…

设计模式--总结和对比

设计模式原则 设计原则一句话归纳目的 开闭原则(OCP) (Open-Close) 对扩展开放&#xff0c;对修改关闭减少维护带来新的风险 依赖倒置原则(DIP) (Dependence Inversion) 高层不应该依赖底层更利于代码结构的升级 扩展 单一职责原则(SRP) (Simple Responsibility) 一个类只干一…

K8S部署Java项目(Gitlab CI/CD自动化部署终极版)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

基于Java SSM框架实现家庭食谱管理系统项目【项目源码+论文说明】

基于java的SSM框架实现家庭食谱管理系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个家庭食谱管理系统 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论…

golang 函数式编程库samber/mo使用: Either

golang 函数式编程库samber/mo使用&#xff1a; Either 如果您不了解samber/mo库&#xff0c; 请先阅读第一篇 Option 结构定义 有时候我们不确定值的类型&#xff0c; 一个值可能是int&#xff0c; 也可能是string&#xff0c; 这时候我们可以使用Either类型。 Either类型是…

STM32--低功耗模式详解

一、PWR简介 正常模式与睡眠模式耗电是mA级&#xff0c;停机模式与待机模式是uA级。 二、电源框图 供电区域有三处&#xff0c;分别是模拟部分供电&#xff08;VDDA&#xff09;&#xff0c;数字部分供电&#xff0c;包括VDD供电区域和1.8V供电区域&#xff0c;后备供电&…

CKA认证,开启您的云原生之旅!

在当今数字化时代&#xff0c;云计算已经成为企业和个人发展的关键技术。而获得CKA&#xff08;Certified Kubernetes Administrator&#xff09;认证&#xff0c;将是您在云原生领域迈出的重要一步。 CKA认证是由Kubernetes官方推出的权威认证&#xff0c;它旨在验证您在Kuber…