接口测试工具Apifox 基础篇:数据传递与处理

2023-11-02

一、接口之间如何传递数据

1、使用场景

接口B请求参数依赖于接口A返回的数据

2、实现思路

2.1 接口A使用后置操作->提取变量功能将请求完成后返回的数据提取作为变量

2.2 接口B对应的参数值直接引用前面设置的变量

3、使用示例

3.1 接口A使用后置操作->提取变量

将接口返回 Response JSON 数据里的 token 值提取到名为 token 的临时变量(或环境变量、全局变量)

3.2  接口B参数引用变量

对应的参数值里写入 {{token}},即引用可名为token的变量。

二、登录态的接口如何处理

1、Session/Cookie 方式

Apifox 会自动保持 Session/Cookie 方式的登录态。

使用方式:

  • 先执行登录接口,执行完成后全局 Cookie 会自动保存返回的 Session/Cookie 信息。
  • 然后运行其他接口,会自动带上 Session/Cookie 信息。

2、Token 方式

Token 方式是将登录凭证放在接口请求参数里(通常会放在 Header)。常见的有Basic Auth、Bearer Token、API Key等方式。

使用方法:

方法一、通过全局(项目概览页)、分组(分组设置)、接口(文档编辑页)的 Auth 设置授权信息,支持如下多种授权类型

方法二、手动将 token 写入 Header 或其他对应参数里(推荐使用 环境变量 存放 token)。

示例:

Bearer Token:设置一个名为Authorization的 Header,设置值为Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9yJpZCI6(或者使用环境变量,设置值为Bearer {{AUTH_TOKEN}})

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

3、全自动登录方式

自动调用登录接口完成登录,无需手动登录

3.1、实现思路

3.1.1、使用 环境变量(如:ACCESS_TOKEN)保存登录需要的凭证。

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

3.1.3、创建一个 公共脚本 :

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

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

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

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

      • 将 header 里的Authorization的设置为{{ACCESS_TOKEN}}。注意:这里也可以使用 Cookie 或其他位置的参数,请根据实际情况确定。
      • 此处也可以在 环境 里的 额外参数 统一设置,所有接口运行时会自动加上 额外参数,无需每个接口手动设置。

B、在 前置脚本 里引用前面创建公共脚本。

3.2、示例:

  • 示例脚本里的登录用户名和密码,是从环境变变量 LOGIN_USERNAME 和 LOGIN_PASSWORD 获取,如果你直接拷贝代码的话,记得要手动设置这两个环境变量。
  • 如果你们的 token 没有过期时间,可以将 ACCESS_TOKEN_EXPIRES相关的代码去除。
// 定义发送登录接口请求方法
function sendLoginRequest() {
    // 获取环境变量里的前置URL
    const baseUrl = pm.environment.get('BASE_URL');
    // 登录用户名,从环境变量LOGIN_USENAME获取,也可以写死(但不建议)
    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 格式,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'
        body: {
            mode: 'raw',
            raw: JSON.stringify({ username: username, password: password }),
        }
        */
    };
    // 发送请求
    pm.sendLoginRequest(loginRequest, function (err, res) {
        if (err) {
            console.log(err);
        } else {
            // 读取接口返回的json数据
            // 如果token信息存放在cookies的,可以使用res.cookies.get('token')方式获取
            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();
}

三、接口签名如何处理

注:统一处理,无需每个接口都处理

1、实现思路

1.1、创建一个 公共脚本 实现签名逻辑,读取接口请求参数,然后使用 内置类库,如(crypto-js),生成签名。

1.2、将生成的签名 sign 作为参数加入请求,可使用以下两种方案:

    • 方案一:脚本直接修改请求信息,注入一个签名参数,无需使用环境变量。(注:脚本只能修改 header 和 query 参数,不能修改 body 参数。如需将签名放在 body 里,只能使用方案二)。
    • 方案二:将生成的签名写入环境变量,接口设置参数时引用环境变量。

1.3、在接口的 前置脚本 里引用前面创建公共脚本。

1.4、如果签名算法是其他语言编写的,可使用fox.execute方法 调用其他语言编写的程序

2、接口签名示例之微信支付签名算法

第一步:假设所有发送参数集合M,将集合M内非空参数值的参数按照参数名 ASCII 码从小到大排序(字典序),使用 URL 键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:

2.1、参数名ASCII码从小到大排序(字典序);

2.2、如果参数的值为空不参与签名;

2.3、参数名区分大小写;

2.4、传送的sign参数不参与签名;

第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

3、公共脚本实现之微信支付签名算法

// 获取预先设置为环境变量的 APPKEY
let key = pm.environment.get("APPKEY");

// 存放所有需要用来签名的参数
let param = {};

// 加入 query 参数
let queryParams = pm.request.url.query;
queryParams.each(item => {
    if (item.value !== '') { // 非空参数值的参数才参与签名
        param[item.key] = item.value;
    }
});

// 加入 body 参数
if (pm.request.body) {
    let formData;
    switch (pm.request.body.mode) {
        case 'formdata':
            formData = pm.request.body.formdata;
            break;
        case 'urlencoded':
            formData = pm.request.body.urlencoded;
            break;
        case 'raw':
            // 如果没有 JSON 格式的请求 body,或 JSON 格式 body 不参与签名,可以删除这一段
            let contentType = pm.request.headers.get('content-type');
            if (
                contentType
                && pm.request.body.raw
                && contentType.toLowerCase().indexOf('application/json') !== -1
            ) {
                try {
                    let jsonData = JSON.parse(pm.request.body.raw);
                    /*
                    * 注意:通过脚本取出来的接口参数,如果参数包含变量,变量是不会替换成对应的值。如想要获取替换后的值,可使用`pm.variables.replaceIn`方法处理:
                * let body = pm.variables.replaceIn(pm.request.body.raw);
                * let jsonData = JSON.parse(body);
                    */
                    for (let key in jsonData) {
                        let value = `${jsonData[key]}`; // 此处要注意如果值的实际类型不是 string 需要根据实际情况处理。
                        if (value !== '') { // 非空参数值的参数才参与签名
                            param[key] = value;
                        }
                    }
                } catch (e) {
                    console.log('请求 body 不是 JSON 格式')
                }
            }
            break;
        default:
            break;
    }
    if (formData) {
        formData.each(item => {
            if (item.value !== '') { // 非空参数值的参数才参与签名
                param[item.key] = item.value;
            }
        });
    }
}


// 取 key
let keys = [];
for (let key in param) {
    // 注意这里,要剔除掉 sign 参数本身
    if (key !== 'sign') {
        keys.push(key);
    }
}

// 参数名 ASCII 码从小到大排序(字典序)
keys.sort();

// 转成键值对
let paramPair = [];
for (let i = 0, len = keys.length; i < len; i++) {
    let k = keys[i];
    paramPair.push(k + '=' + encodeURIComponent(param[k])) // urlencode 编码
}

// 最后加上 key
paramPair.push("key=" + key);

// 拼接
let stringSignTemp = paramPair.join('&');
// console.log(stringSignTemp);

let sign = CryptoJS.MD5(stringSignTemp).toString().toUpperCase();
console.log(sign);

// 方案一:直接修改接口请求的 query 参数,注入 sign,无需使用环境变量。
// queryParams.upsert({
//     key: 'sign',
//     value: sign,
// });

// 方案二:写入环境变量,此方案需要在接口里设置参数引用环境变量
pm.environment.set("SIGN", sign);

4、接口签名示例之微信支付签名算法

百度翻译接口:百度翻译接口参考文档

4.1、签名生成规则

第一步:将请求参数中的 APPID(appid), 翻译query(q, 注意为UTF-8编码), 随机数(salt), 以及平台分配的密钥(可在管理控制台查看) 按照 appid+q+salt+密钥 的顺序拼接得到字符串1。

第二步:对字符串1做md5,得到32位小写的sign。

注:

  1. 待翻译文本(q)需为UTF-8编码
  2. 在生成签名拼接 appid+q+salt+密钥 字符串时,q不需要做URL encode,在生成签名之后,发送HTTP请求之前才需要对要发送的待翻译文本字段q做URL encode

4.2、官方举例

官方举例:将apple从英文翻译成中文:

请求参数:
q=apple
from=en
to=zh
appid=2015063000000001
salt=1435660288
平台分配的密钥: 12345678
生成sign:
>拼接字符串1
拼接appid=2015063000000001+q=apple+salt=1435660288+密钥=12345678
得到字符串1 =2015063000000001apple143566028812345678
>计算签名sign(对字符串1做md5加密,注意计算md5之前,串1必须为UTF-8编码)
sign=md5(2015063000000001apple143566028812345678)
sign=f89f9594663708c1605f3d736d01d2d4
完整请求为:
http://api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4

4.3、公共脚本实现

// 获取 Query 参数对象
var queryParams = pm.request.url.query;

// 获取 query 参数 q 的值
var q = queryParams.get('q');

// 获取预先设置为环境变量的 APPID 和 SECRET_KEY
var appid = pm.environment.get("APPID");
var secretKey = pm.environment.get("SECRET_KEY");

// 定义一个随机数(32768, 65536)之间
var salt = parseInt(Math.random() * (32769) + 32768, 10);

// 将随机数转换为字符串
salt = salt.toString();
console.log(salt);

// 定义一个由appid、要翻译的字符串、随机数、密钥组合成一个字符串
var str = appid + q + salt + secretKey;
console.log(str);

// 将 str 进行 md5 加密生成 sign
var sign = CryptoJS.MD5(str).toString();

// 方案一:直接修改接口请求的 query 参数,注入 salt 和 sign,无需使用环境变量。
queryParams.upsert({
    key: 'salt',
    value: salt,
});
queryParams.upsert({
    key: 'sign',
    value: sign,
});

// 方案二:将 salt 和 sign 写入环境变量,此方案需要在接口里设置参数引用环境变量
// pm.environment.set("SALT", salt);
// pm.environment.set("SIGN", strmd5);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

接口测试工具Apifox 基础篇:数据传递与处理 的相关文章

随机推荐

  • 关于【Stable-Diffusion WEBUI】方方面面研究(内容索引)

    文章目录 零 前言 0 1 我的相关文章索引 0 2 本篇内容阅读提示 一 绘图 1 1 模型 1 2 绘图方式 文生图 1 3 插件 可选附加网络 LoRA插件 Additional networks 1 4 插件 ControlNet
  • pytest运用引进@pytest.mark.parametrize中ids 导致编码乱码解决

    pytest运用引进 pytest mark parametrize中ids 导致编码乱码解决 pytest mark parametrize 运行用例导致显示会形成乱码 有俩种方法解决 第一种 创建个pytest ini 文件 输入 py
  • 【华为OD机试】经典屏保【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 DVD机在视频输出时 为了保护电视显像管 在待机状态会显示 屏保动画 如下图所示 DVD Logo在屏幕内来回运动 碰到边缘会反弹 请根据如下要求 实现屏保Logo坐
  • NGINX 传递客户端IP

    当服务部署在服务器上时 一般都是通过nginx做代理转发 但是在common中的aop日志打印时 ip获取到的就变成本地的了 可以通过修改nginx的代理配置 以及后端的工具类解析 打印真实ip nginx配置 只需配置在监听的对应端口下就
  • 决策树篇

    决策树 随机森林属于集成学习 Ensemble Learning 中的bagging算法 在集成学习中 主要分为bagging算法和boosting算法 我们先看看这两种方法的特点和区别 Bagging 套袋法 bagging的算法过程如下
  • Vuex ——详细介绍

    Vuex 是一个专门为 Vue js 应用程序开发的状态管理模式 它采用集中式存储管理应用的所有组件状态 并以相应的规则保证状态以一种可预测的方式发生变化 可以理解为 将多个组件共享的变量全部存储在一个对象里面 然后将这个对象放在顶层的 V
  • Scrapy中Spiders的用法

    本文来自官方文档 包括Spiders的简介 一些参数的实例讲解和一些例子 Spiders Spider类定义了如何爬取某个 或某些 网站 包括了爬取的动作 例如 是否跟进链接 以及如何从网页的内容中提取结构化数据 爬取item 换句话说 S
  • Linux网络管理

    目录 一 网络管理的概述 二 各种参数的配置 三 获得网卡配置参数的方式 四 网络参数配置 1 图形化 2 命令行 3 配置文件 五 网卡启停操作 六 路由配置查看 七 网络连接查看 一 网络管理的概述 网络负责进行计算机通信 可以实现客户
  • C语言递归实现二分法查找

    专升本过程中遇到的问题 现用C语言递归实现二分法查找算法 本人的第一篇博文 如有错误 还请指正 关于二分法的详细介绍 请看链接 递归实现二分法查找 语言 C语言 开发环境 Windows 10 VC 6 0 代码版本 1 0 作者 影帝级扑
  • Jsp页面POST提交表单出现404

    项目场景 在IDEA里启动tomcat通过jsp页面访问servlet servlet映射的url通过注解设置为 login 问题描述 jsp页面里提交表单时 浏览器里出现如下的404提示信息 未找到 原因分析 在IDEA配置tomcat的
  • 并发编程笔记——多线程设计模式

    1 Single Threaded Execution模式 单线程执行模式 指 以 个线程执 该模式 于设置限制 以确保同 时间只能让 个线程执 处理 2 Immutable模式 不可变模式 存在确保实例状态不发 改变的类 在访问这些实例时
  • c++后台开发适合入坑吗?就业前景如何?

    一 什么是c 后台开发 c 后台开发也可以叫c 后端开发 其实从技术上来说并无不同 c 后台开发就是基于linux环境和C 语言的服务器程序开发 像qq服务器 微信服务器 王者荣耀服务器等等 虽然现在各种高级语言大火 但是在高性能这一块 c
  • 旧版本Druid回收连接引发的'recyle error'

    公司官网上的心跳交易不执行了 按理说是定时任务做的 怎么会不执行呢 遂去查看日志发现 ERROR 2018 09 25 20 30 37 933 AgtForwardServiceImpl java 31 转发数据推送异常 nested e
  • 学习Python的心得体会

    随着人工智能 大数据的火热 Python成为了广大科学家和普通大众的学习语言 在学习Python的过程中 我感到迷茫不知道自己该从什么地方入手 我在学习Python之前了解过这门语言 也知道Python有很多的学习方向 比如说数据采集方向
  • 【配置跑通Omni-Swarm(omni swarm:开源的多机器人协同SLAM算法)持续踩坑排雷更新中。。。】

    配置跑通Omni Swarm omni swarm 开源的多机器人协同SLAM算法 持续踩坑排雷更新中 旨在记录跑通Omni Swarm过程 踩坑排雷 文章目录 配置跑通Omni Swarm omni swarm 开源的多机器人协同SLAM
  • linux中.tar文件怎么解压

    linux中 tar文件怎么解压 1 打包压缩tar cvf etc tar app etc 打包 tar zcvf pack tar gz pack 打包压缩为一个 gz格式的压缩包 tar jcvf pack tar bz2 pack
  • 编写.gitignore文件

    有时候我们并不想要把一个项目都提交到git上 比如一个基于当前服务器的配置 当项目迁移到另一个服务器上时 这个配置相应变成了与另一个服务器相关的 如果在提交到git服务器时连同该配置一同提交 就很容易因为未及时修改而发生错误 这时候 就需要
  • 无约束最优化问题

    估计有些读者看到这个题目的时候会觉得很数学 和自然语言处理没什么关系 不过如果你听说过最大熵模型 条件随机场 并且知道它们在自然语言处理中被广泛应用 甚至你明白其核心的参数训练算法中有一种叫LBFGS 那么本文就是对这类用于解无约束优化算法
  • var模型matlab代码_VAR模型

    前言 说来话长 这是失败的实践 前几天有个比赛 其中数据处理部分 它给出了前很多年2G 3G 4G 总无线接入网络数据规模的数据 让预测2020年5G和总的 当时一看题就觉得要用时间序列模型 多元时间序列模型就想拿VAR练练手 但是因果检验
  • 接口测试工具Apifox 基础篇:数据传递与处理

    一 接口之间如何传递数据 1 使用场景 接口B请求参数依赖于接口A返回的数据 2 实现思路 2 1 接口A使用后置操作 gt 提取变量功能将请求完成后返回的数据提取作为变量 2 2 接口B对应的参数值直接引用前面设置的变量 3 使用示例 3