API测试中如何利用Postman和Apipost进行参数编码与加密

embedded/2025/2/28 11:57:07/

在API测试工作中,开发者和测试人员经常需要对请求中的某些参数进行编码或加密,以满足安全性和系统需求。这些操作可以针对单独的字段,也可以涉及整个请求体的复杂计算。为了解决这些需求,Postman与Apipost这两款流行的API测试工具为我们提供了便捷的自定义函数和内置函数支持。

本文将通过以下两个实际场景,讲解如何使用Postman与Apipost完成这些任务:

  1. 场景1:参数字段的编码与加密
  • 用户登录时,对密码字段进行md5加密
  1. 场景2:根据请求体生成token
  • 将请求的JSON体进行字典序排序后,计算签名,加密生成token,并追加到请求参数中。

在这些场景中,Postman和Apipost都提供了较为灵活的脚本支持,其强大的内置库如CryptoJS和编码函数等可以解决很多问题。除此外,Apipost100%兼容Postman脚本语法的基础上,则进一步简化了操作,借助更直观的界面和少量代码,提升了测试效率。

接下来,让我们从实战角度详细探讨这两款工具的解决方法,并提供代码示例。

场景1:参数字段进行编码与加密操作

实现需求

用户登录时,将输入的明文密码通过md5加密后发送。

Postman的实现方式

Postman通过前置脚本(Pre-request Script)的形式支持这些场景。以下是对应实现的脚本示例。

要完成此步骤,Postman 需要两步,需要先在密码参数处引入变量,然后在前置脚本中去设置此变量值。

1、在Postman中加入变量password占位符;
值得注意的是,Postman以及Apipost使用变量的方式都是{{变量名}}

在Postman中引入变量.png

2、在Pre-request Script中定义变量password的值

Postman内置了CryptoJS库,可以用来完成大多数常见的加密和散列算法操作,例如md5、SHA1、SHA256等。
将用户输入的密码进行md5加密发送,代码如下:

// 引入CryptoJS库
const CryptoJS = require('crypto-js');// 用户输入的明文密码
let plainPassword = "123456";// 使用MD5加密
let encryptedPassword = CryptoJS.MD5(plainPassword).toString();// 将加密后的密码设置为环境变量,供请求体或参数使用
pm.environment.set("password", encryptedPassword);console.log("加密后的密码是:", encryptedPassword);

此处,pm.environment.set 是Postman提供的环境变量设置方式,方便在请求中随时引用加密结果。执行后,实际发送的数据就是经过md5编码后的数据。

在Pre-request Script中定义变量的值.png

Apipost_56">Apipost的实现方式

首先,Apipost完全兼容Postman的使用方式,上述使用方式在Apipost中完全同样适用,且无需修改任何脚本代码。
<a class=Apipost完全兼容Postman的使用方式" />

除此外,Apipost提供了更加便捷的使用方式。

首先我们只需点击参数值旁边的「插入动态值」图标,选择「固定值」-「添加处理函数」-「选择MD5」即可。如下图所示:

第一步:「插入动态值」
插入动态值

第二步:选择「固定值」以及「添加处理函数」
在这里插入图片描述
第三步:发送即可。
在这里插入图片描述
可视化的简单2步,我们实现了同样的效果。

场景2:根据请求体计算token

实现需求

在这里插入图片描述

针对以上接口,根据下述鉴权规则,我们需要将请求体的JSON数据进行:

  1. 排字典序;
  2. 加密生成密钥(如SHA256/HMAC);
  3. 将生成的密钥以参数名token的添加到到请求头或参数中。

Postman的实现方式

在Postman中,可以通过前置脚本完成上述复杂逻辑。以下是一个完整的实现:

// 引入内置的CryptoJS库
const CryptoJS = require('crypto-js');// 获取请求体
// pm.request.body.raw 默认取得的是字符串,需要JSON.parse转成对象
let requestBody = JSON.parse(pm.request.body.raw);
console.log( requestBody)
// Step 1: 排字典序
let sortedKeys = Object.keys(requestBody).sort(); // 获取排序后的键
let sortedBody = {};
sortedKeys.forEach(key => {sortedBody[key] = requestBody[key]; // 将键值对按顺序加入对象
});// 转换为字符串格式
let sortedBodyString = JSON.stringify(sortedBody);// Step 2: 使用SHA256生成签名
let secretKey = "mysecretkey123"; // 假设的秘钥
let token = CryptoJS.HmacSHA256(sortedBodyString, secretKey).toString(CryptoJS.enc.Hex);// Step 3: 将token添加到环境变量
pm.environment.set("authToken", token);console.log("生成的token是:", token);

稍后,我们可以在请求头中通过Postman的变量引用功能,添加:

Authorization: Bearer {{authToken}}

在这里插入图片描述

这样,发送后,Postman就会字段计算 token值,并添加到请求头中,如下图所示:
在这里插入图片描述

Apipost_128">Apipost的实现方式

Apipost中,仍旧完全可以100%兼容上述 Postman 前置脚本。除此外,Apipost 支持进一步简化操作,无需引入变量,可以将token直接添加到请求头,以下是等价代码:

// 引入内置的CryptoJS库
const CryptoJS = require('crypto-js');// 获取请求体
// pm.request.body.raw 默认取得的是字符串,需要JSON.parse转成对象
let requestBody = JSON.parse(pm.request.body.raw);
console.log( requestBody)
// Step 1: 排字典序
let sortedKeys = Object.keys(requestBody).sort(); // 获取排序后的键
let sortedBody = {};
sortedKeys.forEach(key => {sortedBody[key] = requestBody[key]; // 将键值对按顺序加入对象
});// 转换为字符串格式
let sortedBodyString = JSON.stringify(sortedBody);// Step 2: 使用SHA256生成签名
let secretKey = "mysecretkey123"; // 假设的秘钥
let token = CryptoJS.HmacSHA256(sortedBodyString, secretKey).toString(CryptoJS.enc.Hex);// Step 3: 无需引入变量,将token直接添加到请求头pm.setRequestHeader("Authorization", `Bearer ${token}`);

相较于Postman,Apipost在操作上省去了引入环境变量的步骤,进一步提升效率。

Apipost_162">总结:Postman与Apipost的选择

  • Postman 适合对脚本要求灵活性较高、且需自定义较多逻辑的场景。但是凡事皆须写脚本的逻辑导致学习成本高昂。
  • Apipost 不仅完全兼容了 Postman 的脚本,进一步的,对于常见需求的加密和编码操作上更加便捷,尤其是内置了更多实用函数,让新手用户可以快速上手完成编码与加密任务。

在实际项目中,可以根据团队的技术水平与项目复杂度选择最适合的工具。如果你正在进行复杂的API测试,不妨尝试这两种工具,根据本文中的实例动手实践!


http://www.ppmy.cn/embedded/167798.html

相关文章

C++蓝桥杯基础篇(六)

片头 嗨~小伙伴们&#xff0c;大家好&#xff01;今天我们来一起学习蓝桥杯基础篇&#xff08;六&#xff09;&#xff0c;练习相关的数组习题&#xff0c;准备好了吗&#xff1f;咱们开始咯&#xff01; 第1题 数组的左方区域 这道题&#xff0c;实质上是找规律&#xff0c;…

前端TypeScript 面试题及参考答案

目录 解释 unknown 与 any 的区别,如何安全使用 unknown 类型? 如何用类型守卫处理联合类型变量的方法调用? 实现一个工具类型 Nullable ,使 T 可被赋值为 null/undefined 如何用 keyof 和 in 关键字实现枚举类型到联合类型的转换? 类型断言 as 与尖括号语法有何差异…

Hyperlane:高性能Rust后端框架的革新者

Hyperlane&#xff1a;高性能Rust后端框架的革新者 在当今高并发的互联网环境下&#xff0c;开发者亟需兼具性能与开发效率的工具。Hyperlane作为一款基于Rust语言构建的轻量级HTTP服务器框架&#xff0c;凭借其卓越的设计理念和丰富的功能特性&#xff0c;正在成为构建现代We…

微软推出Office免费版,限制诸多,只能编辑不能保存到本地

易采游戏网2月25日独家消息&#xff1a;微软宣布推出一款免费的Office版本&#xff0c;允许用户进行基础文档编辑操作&#xff0c;但限制颇多&#xff0c;其中最引人关注的是用户无法将文件保存到本地。这一举措引发了广泛讨论&#xff0c;业界人士对其背后的商业策略和用户体验…

Linux(centOS) 命令提示符格式修改(PS1)

1. 命令提示符的组成 命令提示符&#xff08;PS1&#xff09;通常由以下部分组成&#xff1a; 部分示例说明[ 和 ][...]提示符的开头和结尾&#xff0c;用于视觉分隔。用户名root 或 tianjiajie当前登录的用户。root 是超级用户&#xff0c;普通用户可能是其他名称。分隔用户…

【算法】796. 子矩阵的和

题目 796. 子矩阵的和 思路 和一维前缀和类似&#xff0c;只不过在算s[i][j]时先减去两部分再加上减的重复的一部分再加上a[i][j]。最后输出时就用s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]s[x1-1][y1-1]<<endl。 代码 #include<iostream> using namespace std; con…

前端性能测试面试题及参考答案

目录 前端性能测试中,首屏时间(FCP)和白屏时间的定义及测量方法是什么? 解释浏览器渲染过程中关键路径(Critical Rendering Path)的组成部分。 如何通过 Navigation Timing API 统计页面加载各阶段耗时? 什么是 LCP(Largest Contentful Paint)?如何优化? 前端性…

C++初阶—list类

第一章&#xff1a;list的介绍及使用 1.1 list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指…