【Apifox】token的使用方式和脚本示例

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

一、手动登录获取token

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

操作步骤
1)添加环境变量、全局参数
这里拿测试环境举例,在右上角环境中配置详细信息:测试环境填写变量名以及本地值
{{token}}

再在全局参数添加参数名和默认值(这样就不用每个接口都写一遍token了)

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

添加完毕后,执行一次获取token接口,就会把登录接口返回的token数据填充到环境变量和全局参数中。

这样请求其他接口就可以在实际参数中看到最新的token了

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

二、全自动登录实现方式
期望效果
  1. 运行接口用例的时候,自动完成登录,而无需手动登录。

  2. 自动登录过一次后,保存登录态,避免每次执行用例都调用登录接口。

实现思路
  1. 使用 环境变量(如:token)保存登录需要的凭证。

  2. 如凭证有过期时间,使用环境变量(如:token_expires)保存登录凭证的过期时间。

  3. 创建一个 公共脚本 :

判断环境变量token是否有值,以及token_expires是否过期,如果存在且未过期,跳出执行,否则下一步。

使用 pm.sendRequest 调用登录接口,将登录接口返回的登录凭证写入环境变量,过期时间也写入环境变量。

我这里登录获取token接口是没有token_expires的,所以我去掉了相关代码,下面最后面有完整的官方示例代码,请参考!

 这是我的脚本代码:

//定义XX接口请求方法,看token是否失效
function sendViewSchemeListRequest() {
    // 获取环境里的 前置URL
    const baseUrl = pm.environment.get("BASE_URL");
    const token = pm.environment.get("token");
    //从环境变量获取code
    const code = pm.environment.get("code");
 
    // 构造一个 POST body 为 json 格式请求。
    const viewSchemeListRequest = {
        url: baseUrl + "/test_uri",
        method: "POST",
        header: {
            // 注意:header 需要加上 Content-Type
            "Content-Type": "application/json",
            'token': token,
            'Code': code,
        },
        body: {
            mode: 'raw',// 此处为 raw
            // 序列化后的 json 字符串
            raw: JSON.stringify(
                {
                    "data": { "current": 1, "pageSize": 10 }
                }),
        },
    };
    // 发送请求。
    pm.sendRequest(viewSchemeListRequest, function (err, res) {
        if (err) {
            console.log(err);
        } else {
            const jsonData = res.json();
            // 将 scheme_list_message 写入环境变量
            pm.environment.set("scheme_list_message", jsonData.message);
        }
    });
}
 
 
// 定义发送登录接口请求方法
function sendLoginRequest() {
    // 获取环境里的 前置URL
    const baseUrl = pm.environment.get("BASE_URL_LOGIN");
    // 登录用户名,这里从环境变量 LOGIN_USERNAME 获取,也可以写死(但是不建议)
    const username = pm.environment.get("LOGIN_USERNAME");
    // 登录密码,这里从环境变量 LOGIN_PASSWORD 获取,也可以写死(但是不建议)
    const password = pm.environment.get("LOGIN_PASSWORD");
    //从环境变量获取code
    const code = pm.environment.get("code");
 
    // 构造一个 POST body 为 json 格式请求。
    const loginRequest = {
        url: baseUrl + "/login",
        method: "POST",
        header: {
            // 注意:header 需要加上 Content-Type
            "Content-Type": "application/json",
            'appId': "XXX",
            'appToken': "XXX",
            'timeStamp': "1680845431151",
            'Code': code,
        },
        body: {
            mode: 'raw',// 此处为 raw
            // 序列化后的 json 字符串
            raw: JSON.stringify(
                {
                    "data":
                    {
                        "loginType": "1",
                        "accountName": username,
                        "password": password,
                        "mobile": "",
                        "verifyCode": ""
                    }
                }),
        },
    };
    // 发送请求。
    pm.sendRequest(loginRequest, function (err, res) {
        if (err) {
            console.log(err);
        } else {
            const jsonData = res.json();
            // 将 token 写入环境变量 token
            pm.environment.set("token", jsonData.data.token);
        }
    });
}
 
//请求学校端查看方案列表接口
sendViewSchemeListRequest()
// 获取环境变量里的 token
const token = pm.environment.get("token");
// 获取环境变量里的 message
const scheme_list_message = pm.environment.get("scheme_list_message");
 
// 如 token 没有值或者message信息不正确,则执行发送登录接口请求
if (
    !token || scheme_list_message === "用户未登陆,请登录后重试" || scheme_list_message === "登录信息已过期,请重新登录"
) {
    sendLoginRequest();
}

设置需要登录态的接口用例:

将用来验证登录态的参数值设置为 {{token}} 。

此处在环境里的全局参数统一设置,所有接口运行时会自动加上全局参数,无需每个接口手动设置。

在 根目录前置操作里引用前面创建的公共脚本,保存后就可以了。 

公共脚本示例

注意

示例脚本里的登录用户名密码,是从环境变变量 LOGIN_USERNAME 和 LOGIN_PASSWORD 获取,如果你直接拷贝代码的话,记得要手动设置这两个环境变量。

如果你们的 token 没有过期时间,可以将 token_expires相关的代码去除。

// 定义发送登录接口请求方法
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: baseUrl + "/api/v1/login",
    method: "POST",
    // body 为 x-www-form-urlencoded 格式
    body: {
      mode: "urlencoded", // 此处为 urlencoded
      // 此处为 urlencoded
      urlencoded: [
        { key: "account", value: "apifox" },
        { key: "password", value: "123456" },
      ],
    },
    /*
    // body 为 form-data 格式
    body: {
      mode: 'formdata', // 此处为 formdata
      // 此处为 formdata
      formdata: [
        { key: 'account', value: 'apifox' },
        { key: 'password', value: '123456' }
      ]
    }
 
    // body 为 json 格式
    header: {
      "Content-Type": "application/json", // 注意:header 需要加上 Content-Type
    },
    body: {
      mode: 'raw',// 此处为 raw
      raw: JSON.stringify({ account: 'apifox', password:'123456' }), // 序列化后的 json 字符串
    }
 
    // body 为 raw 或 json 格式
    body: {
      mode: 'raw',
      raw: '此处为 body 内容',
    }
    */
  };
 
  // 发送请求。
  // 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(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();
      // 将 accessToken 写入环境变量 ACCESS_TOKEN
      pm.environment.set("ACCESS_TOKEN", jsonData.data.accessToken);
      // 将 accessTokenExpires 过期时间写入环境变量 ACCESS_TOKEN_EXPIRES
      pm.environment.set(
        "ACCESS_TOKEN_EXPIRES",
        jsonData.data.accessTokenExpires
      );
    }
  });
}
 
// 获取环境变量里的 ACCESS_TOKEN
const accessToken = pm.environment.get("ACCESS_TOKEN");
 
// 获取环境变量里的 ACCESS_TOKEN_EXPIRES
const accessTokenExpires = pm.environment.get("ACCESS_TOKEN_EXPIRES");
 
// 如 ACCESS_TOKEN 没有值,或 ACCESS_TOKEN_EXPIRES 已过期,则执行发送登录接口请求
if (
  !accessToken ||
  (accessTokenExpires && new Date(accessTokenExpires) <= new Date())
) {
  sendLoginRequest();
}

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/202255.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

37 - 数据库参数设置优化,失之毫厘差之千里

MySQL 是一个灵活性比较强的数据库系统&#xff0c;提供了很多可配置参数&#xff0c;便于我们根据应用和服务器硬件来做定制化数据库服务。如果现在让你回想&#xff0c;你可能觉得在开发的过程中很少去调整 MySQL 的配置参数&#xff0c;但我今天想说的是我们很有必要去深入了…

SourceInsight - Relation Windows

磨刀不误砍柴工&#xff0c;你使用的工具决定了你的下限。我平时使用较多的代码编辑工具就是SourceInsight&#xff0c;这个工具速度快&#xff0c;操作方便&#xff0c;但处理非常大的项目的性能不是很理想&#xff0c;比如你要是添加整个Linux Kernel的源代码的话。 在使用SI…

Retrofit+OkHttp打印Request 请求地址参数

在移动端开发时&#xff0c;我们常常需要像web端一样可以方便地查看我们向服务器发送请求的报文详细日志&#xff08;如请求地址&#xff0c;请求参数&#xff0c;请求类型&#xff0c;服务器响应的耗时时间&#xff0c;请求返回的结果等等&#xff09;。 使用Retrofit时&…

C语言进阶指南(14)(部分字符串库函数及其模拟实现)

欢迎来到博主的专栏——C语言进阶指南 博主id&#xff1a;reverie_ly 文章目录 1、strlen&#xff08;&#xff09;——字符串长度计算函数自定义strlen函数的实现 2、strcpy——字符串拷贝函数strcpy的模拟实现 3.strcat——字符串追加函数strcat的模拟实现 4、strcmp——字符…

vue2+element-ui npm run build打包后,在服务器打开报错

报错 页面的图标也显示不出来&#xff0c;如下 解决&#xff1a; 在build->utils.js文件里面加上publicPath: ../../&#xff0c;再打包发布一下就可以了 // Extract CSS when that option is specified// (which is the case during production build)if (options.extrac…

LabVIEW当鼠标悬停在图形曲线上时显示坐标

LabVIEW当鼠标悬停在图形曲线上时显示坐标 在波形图上显示波形数据后&#xff0c;当鼠标放在波形图的曲线上时&#xff0c;如何自动显示对应点的坐标&#xff1f; 1. 创建事件结构&#xff0c;选择“波形图”作为“事件源”&#xff0c;选择“鼠标移动”作为“事件”&a…

MySQL之redo log

聊聊REDO LOG 为什么需要redolog&#xff1f; 那redolog主要是为了保证数据的持久化&#xff0c;我们知道innodb存储引擎中数据是以页为单位进行存储&#xff0c;每一个页中有很多行记录来存储数据&#xff0c;我们的数据最终是要持久化到硬盘中&#xff0c;那如果我们每进行…

为什么 SQL 日志文件很大,我应该如何处理?

SQL Server 日志文件是记录所有数据库事务和修改的事务日志文件。在 SQL 术语中&#xff0c;此日志文件记录对数据库执行的所有 INSERT、UPDATE 和 DELETE 查询操作。 如果数据库处于联机状态或处于恢复状态时日志已满&#xff0c;则 SQL Server 通常会发出 9002 错误。在这种…

windows系统用nginx部署web应用

要在Windows系统上使用Nginx进行本地部署和运行Web应用程序&#xff0c;可以按照以下步骤进行操作&#xff1a; 1.首先下载nginx&#xff0c;需要去nginx官网&#xff1a; nginx: download 下载最新版本的&#xff1a; 2.解压缩Nginx&#xff1a;找个磁盘位置&#xff0c;新…

C++ AVL 树

AVL树的概念 当数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;此时二叉搜索树的搜索效率低下 解决方法&#xff1a;AVL树&#xff08;降低树的高度&#xff0c;从而减少平均搜索长度) 一棵AVL树或者是空树&#xff0c;或者是具有以下性质的二叉搜索树&#xff1…

1.自动化运维工具Ansible的安装

1.物料准备 四台服务器&#xff0c;其中一个是主控机&#xff0c;三个为host 2.安装 在主控机上安装ansible 2.1 设置EPEL仓库 Ansible仓库默认不在yum仓库中&#xff0c;因此我们需要使用下面的命令启用epel仓库。 yum install epel-release -y2.2 执行安装命令 yum i…

temu的产品发布后在哪里显示

temu是一款备受瞩目的产品&#xff0c;其发布后引起了广泛的关注。但是&#xff0c;很多人对于temu产品发布后在哪里显示存在疑惑。本文将深入探讨temu产品的展示方式和关键特点&#xff0c;帮助读者更好地了解temu产品在发布后的展示位置。 先给大家推荐一款拼多多/temu运营工…

贝锐向日葵与华为达成合作,启动鸿蒙原生应用开发

2023年11月24日&#xff0c;贝锐与华为携手举办鸿蒙原生应用开发启动仪式。贝锐创始人之一兼首席技术官张小峰先生、贝锐事业部总经理张海英女士共同出席了此次活动&#xff0c;并达成重大合作。贝锐旗下国民级远程控制品牌贝锐向日葵将以原生方式适配鸿蒙系统&#xff0c;成为…

串口理解小结(UART)

串口作为单片机的必备外设&#xff0c;主要用于单片机与其它模块的信息通讯、程序烧录和升级作用。 UART全称为通用异步收发器。 可分为&#xff1a; 一、串行和并行 串行指数据位只能一位一位地发送 并行之多个数据位同时发送 二、同步和异步 同步和异步是相当于时钟而…

AcWing 3555:二叉树(北京大学考研机试题)→公共父结点

【题目来源】https://www.acwing.com/problem/content/description/3435/【题目描述】 如下图所示&#xff0c;由正整数 1, 2, 3, … 组成了一棵无限大的&#xff08;满&#xff09;二叉树。 1/ \2 3/ \ / \4 5 6 7 /\ /\ /\ /\ ... ... 从任意一个结点到根结点&…

25. 深度学习进阶 - 权重初始化,梯度消失和梯度爆炸

文章目录 权重初始化梯度消失与梯度爆炸 Hi&#xff0c;你好。我是茶桁。 咱们这节课会讲到权重初始化、梯度消失和梯度爆炸。咱们先来看看权重初始化的内容。 权重初始化 机器学习在我们使用的过程中的初始值非常的重要。就比如最简单的wxb&#xff0c;现在要拟合成一个yha…

TZOJ 1373 求多项式的和

答案&#xff1a; #include <stdio.h> int main() {int m 0;scanf("%d", &m); // 读取测试实例的个数 while (m--) //循环m次{int n 0, i 0;scanf("%d", &n); // 读取求和项数n double sum 0.0;for (i 1; i < n; i) //分…

JenKins快速安装与使用

一、JenKins 0.准备&#xff0c;配置好环境 1&#xff09;Git&#xff08;yum安装&#xff09; 2&#xff09;JDK&#xff08;自行下载&#xff09; 3&#xff09;Jenkins&#xff08;自行下载&#xff09; 1.下载安装包 进官网&#xff0c;点Download下方即可下载。要下…

linux之下安装 nacos

1 下载地址 也可使用在线下载wget https://github.com/alibaba/nacos/releases/download/1.4.6/nacos-server-1.4.6.tar.gzTags alibaba/nacos GitHuban easy-to-use dynamic service discovery, configuration and service management platform for building cloud nativ…

一次Apollo Client升级导致的生产404 Not Found问题排查记录

概述 本文记录一次升级Apollo Client组件到1.7.0后遇到的重大生产事故。只想看结论的&#xff0c;可直接快进到文末。实际上&#xff0c;第一句话就是一个结论。 另&#xff0c;本文行文思路事后看起来可行略显思路清晰&#xff0c;实际上排查生产问题时如无头苍蝇&#xff0…