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

发布于:2025-03-04 ⋅ 阅读:(13) ⋅ 点赞:(0)

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

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

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

在这些场景中,Postman和Apipost都提供了较为灵活的脚本支持,其强大的内置库如CryptoJS和编码函数等可以解决很多问题。除此外,Apipost在100%兼容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的实现方式

首先,Apipost完全兼容Postman的使用方式,上述使用方式在Apipost中完全同样适用,且无需修改任何脚本代码。
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的实现方式

在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在操作上省去了引入环境变量的步骤,进一步提升效率。

总结:Postman与Apipost的选择

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

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