【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() {// 获取环境里的 前置URLconst baseUrl = pm.environment.get("BASE_URL");const token = pm.environment.get("token");//从环境变量获取codeconst 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() {// 获取环境里的 前置URLconst 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");//从环境变量获取codeconst 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 写入环境变量 tokenpm.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() {// 获取环境里的 前置URLconst 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// 此处为 urlencodedurlencoded: [{ key: "account", value: "apifox" },{ key: "password", value: "123456" },],},/*// body 为 form-data 格式body: {mode: 'formdata', // 此处为 formdata// 此处为 formdataformdata: [{ key: 'account', value: 'apifox' },{ key: 'password', value: '123456' }]}// body 为 json 格式header: {"Content-Type": "application/json", // 注意:header 需要加上 Content-Type},body: {mode: 'raw',// 此处为 rawraw: 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-sendrequestpm.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-cookiesconst jsonData = res.json();// 将 accessToken 写入环境变量 ACCESS_TOKENpm.environment.set("ACCESS_TOKEN", jsonData.data.accessToken);// 将 accessTokenExpires 过期时间写入环境变量 ACCESS_TOKEN_EXPIRESpm.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();
}

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端编码规范

文章目录 一、背景二、内容1、注释规范&#xff08;1&#xff09;文件注释&#xff08;2&#xff09;函数注释&#xff08;3&#xff09;单行注释&#xff08;3&#xff09;多行注释 2、命名规范&#xff08;1&#xff09;项目命名&#xff08;2&#xff09;目录命名&#xff0…

Bug 检查 0x7B:INACCESSIBLE_BOOT_DEVICE(未解决)

环境&#xff1a; HP ProDesk 480 G7 Win10 专业版 问题描述&#xff1a; INACCESSIBLE_BOOT_DEVICE bug 检查的值为0x0000007B。 此 bug 检查表明 Microsoft Windows 操作系统在启动过程中无法访问系统分区 原因&#xff1a; 1.INACCESSIBLE_BOOT_DEVICE bug 检查经常发生…

大数据Hadoop-HDFS_元数据持久化

大数据Hadoop-HDFS_元数据持久化 &#xff08;1&#xff09;在HDFS第一次格式化后&#xff0c;NameNode&#xff08;即图中的主NameNode&#xff09;就会生成fsimage和editslog两个文件&#xff1b; &#xff08;2&#xff09;备用NameNode&#xff08;即图中的备NameNode&…

【学习笔记】GAN实战(基础)

本文介绍构建和训练生成对抗网络(GAN)的方法。 生成对抗网络(GAN)与生成模型导论 生成对抗网络(Generative Adversarial Network,GAN) GAN简介 机器学习算法擅长识别已有数据中的模式,并将这种能力用于分类(为样本分配正确类别)和回归(根据一系列的输入进行数值…

【Lustre相关】功能实践-03-文件级冗余(FLR)

一、前言 DDN-03.11-File Level Redundancy (FLR) Category:FLR 1、功能介绍 在文件级冗余&#xff08;File Level Redundancy&#xff0c;FLR&#xff09;特性出现之前&#xff0c;Lustre文件系统数据冗余完全依赖于后端存储设备&#xff08;如RAID6&#xff09;。 Lustre在L…

SpringCloudSleuth+Zipkin 整合及关键包汇总

背景 整合了一下 SpringCloudSleuth Zipkin&#xff0c;本来是很简单的东西&#xff0c;但是最终导出依赖包时没注意&#xff0c;导致目标服务上始终没有纳入 Zipkin 的链路追踪中&#xff0c;本文记录这个过程及关键依赖包。 部署zipkin 官网下载最新的 zipkin 可执行包&a…

创建Asp.net MVC项目实现视图页面数据传值显示

MVC中视图传值 ViewData ViewBag TempData 举例创建三中传值方式实现页面数据展示 MVC中视图传值 Asp.net MVC中Controller向View传值有多种方式,这里简单说一下其中3种方式 ViewData、ViewBag和TempData ViewData ViewData存储数据&#xff0c;ViewData的声明和赋值方…

基于物联网的交叉口智能交通灯控制系统设计与实现

摘 要 智能视频监控技术是近年来新兴的一种利用计算机视觉技术&#xff0c;人工智能技术和数字视频处理技术对监控视频的目标进行识别&#xff0c;通过对此的分析处理&#xff0c;从而对视频监控系统进行控制&#xff0c;智能视频监控技术是一项较为复杂的课题。特别是对运动物…

代码随想录算法训练营第五十九天| 503.下一个更大元素II 42. 接雨水

文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;代码随想录B站账号 状态&#xff1a;看了视频题解和文章解析后做出来了 503.下一个更大元素II class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:res [-1] * len(nums)stack []for i in…

普中STM32 单片机资料

普中科技–各型号开发板资料下载链接: ①普中-精灵1开发板: 百度网盘链接:https://pan.baidu.com/s/1Pa8Ep1xmg6uoq17O6Nwyyw?pwd=1234 提取码:1234 ②普中-ESP32开发板: 百度网盘链接:https://pan.baidu.com/s/16VthcbW27oEWp162H3bi6Q?pwd=1234 提取码:1234 一…

Springboot 使用 阿里的 druid 连接池 启用 wall sql防火墙的情况下怎么支持多sql同时执行?

1、问题如上&#xff0c;看了不少网上的文章&#xff0c;在我这都不生效&#xff0c;网上主要的解决思路有两个。 第一个是&#xff1a;去掉配置文件中的 wall filter # 修改之前 spring.datasource.druid.filtersstat,wall,log4j# 修改之前 spring.datasource.druid.filte…

【Pytorch】Visualization of Feature Maps(5)——Deep Dream

学习参考来自&#xff1a; PyTorch实现Deep Dreamhttps://github.com/duc0/deep-dream-in-pytorch 文章目录 1 原理2 VGG 模型结构3 完整代码4 输出结果5 消融实验6 torch.norm() 1 原理 其实 Deep Dream大致的原理和【Pytorch】Visualization of Feature Maps&#xff08;1&…

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

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

Python TypeError: int() argument must be a string, a bytes原因

int()函数的TypeError Python开发过程中&#xff0c;使用int()函数来转换或生成int类型的数据时&#xff0c;如果Python抛出并提示TypeError: int() argument must be a string, a bytes-like object or a real number, not complex&#xff0c;那么原因在于传递给int()函数的…

45、Flink 的指标体系介绍及验证(3)- 完整版

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

day67

今日回内容 视图层 响应对象 cbv和fbv 上传文件 模板层 视图层 一、响应对象 响应对象的本质都是 HttpResponse HttpResponse:字符串 render&#xff1a; 将一个模板页面中的模板语法进行渲染&#xff0c;最终渲染成一个html页面作为响应体。 redirect&#xff1a;重定向 …

Java SpringBoot DES加密解密

可以使用 hutool加密 &#xff0c;在本地没什么问题&#xff0c;但是在服务器会出现JDK安全问题 JCE cannot authenticate the provider BC 可以在本地写工具类进行DES加密 package com.neusoft.hit.cmpd.emg.nurse.information.utils;import javax.crypto.BadPaddingExceptio…

MATLAB基础应用精讲-【基础知识篇】MATLAB脚本和函数

目录 循环和条件语句 函数文件 函数句柄 输入参数数量 变量名称 实时脚本

药物副作用预测网络---------数据处理(2)

上一篇文章已经对7个txt文件做出了初步的筛选&#xff0c;现在借用excel来进行需要的数据筛选以及对空值的填补。&#xff08;ps,其实主要就是对DEMO以及DRUG的清洗&#xff09; 1.DEMO文件&#xff1a;&#xff08;主要存储了报告信息以及病例患者的基本信息&#xff09; pr…

从源代码出发,Jenkins 任务排队时间过长问题的解决过程

最近开发了一个部署相关的工具&#xff0c;使用 Jenkins 来构建应用。Jenkins 的任务从模板中创建而来。每次部署时&#xff0c;通过 Jenkins API 来触发构建任务。在线上运行时发现&#xff0c;通过 API 触发的 Jenkins 任务总是会时不时在队列中等待较长的时间。某些情况下的…