在API测试工作中,开发者和测试人员经常需要对请求中的某些参数进行编码或加密,以满足安全性和系统需求。这些操作可以针对单独的字段,也可以涉及整个请求体的复杂计算。为了解决这些需求,Postman与Apipost这两款流行的API测试工具为我们提供了便捷的自定义函数和内置函数支持。
本文将通过以下两个实际场景,讲解如何使用Postman与Apipost完成这些任务:
- 场景1:参数字段的编码与加密
- 用户登录时,对密码字段进行md5加密
- 场景2:根据请求体生成token
- 将请求的JSON体进行字典序排序后,计算签名,加密生成token,并追加到请求参数中。
在这些场景中,Postman和Apipost都提供了较为灵活的脚本支持,其强大的内置库如CryptoJS
和编码函数等可以解决很多问题。除此外,Apipost在100%
兼容Postman脚本语法的基础上,则进一步简化了操作,借助更直观的界面和少量代码,提升了测试效率。
接下来,让我们从实战角度详细探讨这两款工具的解决方法,并提供代码示例。
场景1:参数字段进行编码与加密操作
实现需求
用户登录时,将输入的明文密码通过md5加密后发送。
Postman的实现方式
Postman通过前置脚本(Pre-request Script)的形式支持这些场景。以下是对应实现的脚本示例。
要完成此步骤,Postman 需要两步,需要先在密码参数处引入变量,然后在前置脚本中去设置此变量值。
1、在Postman中加入变量password
占位符;
值得注意的是,Postman以及Apipost使用变量的方式都是{{变量名}}
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编码后的数据。
Apipost_56">Apipost的实现方式
首先,Apipost完全兼容Postman的使用方式,上述使用方式在Apipost中完全同样适用,且无需修改任何脚本代码。
Apipost完全兼容Postman的使用方式" />
除此外,Apipost提供了更加便捷的使用方式。
首先我们只需点击参数值旁边的「插入动态值」图标,选择「固定值」-「添加处理函数」-「选择MD5」即可。如下图所示:
第一步:「插入动态值」
第二步:选择「固定值」以及「添加处理函数」
第三步:发送即可。
可视化的简单2步,我们实现了同样的效果。
场景2:根据请求体计算token
实现需求
针对以上接口,根据下述鉴权规则,我们需要将请求体的JSON数据进行:
- 排字典序;
- 加密生成密钥(如SHA256/HMAC);
- 将生成的密钥以参数名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测试,不妨尝试这两种工具,根据本文中的实例动手实践!