Postman预请求脚本能让你在发送请求前动态处理数据,这对于需要动态生成签名和处理接口依赖的场景非常实用。
动态生成签名:时间戳处理、参数拼接、加密算法,CryptoJS, pm.environment.set
处理接口依赖:前置接口响应解析、变量传递、确保执行顺序,pm.response.json(), pm.environment.set
脚本管理和调试:脚本复用、控制台调试,eval(environment.postmanUtil), console.log()
动态生成签名
接口签名主要用于验证请求的合法性和防止篡改。
获取并设置时间戳
签名通常需要一个时间戳,可以这样生成:
javascript
let timestamp = new Date().getTime(); // 或 Math.round(new Date().getTime()/1000) 获取秒级
pm.environment.set("timestamp", timestamp);
注意:全局或环境变量中需要提前配置好 appId 和 appSecret。
构造签名原文字符串
根据接口规则拼接签名参数,例如:
javascript
let appid = pm.environment.get("appid");
let appSecret = pm.environment.get("appSecret"); // 这里是appSecret,注意变量名
// 假设签名需要body内容、appid、appSecret和时间戳
let plain = appid + "$" + request.url.toLowerCase() + "$" + timestamp; // 示例1
// 或者使用请求体数据和其他参数
// let str = request.data["name"] + request.data["age"]; // 示例2
// let plain = str + appid + appSecret + timestamp; // 示例2
计算签名并设置变量
使用Postman内置的CryptoJS库加密:
javascript
// 使用 HMAC-SHA1 加密 (示例算法)
let sign = CryptoJS.HmacSHA1(plain, appSecret).toString(CryptoJS.enc.Base64);
// 或者使用 MD5 加密 (示例算法)
// let sign = CryptoJS.MD5(plain).toString();
pm.environment.set("sign", sign);
如果Postman的加密库不满足需求,甚至可以请求后台接口生成签名。
注意:签名结果若包含特殊字符(如+),可能需要使用encodeURIComponent()进行编码。
处理接口依赖
在多接口测试中,经常需要将前一个接口的返回值作为后一个接口的参数。
在前置接口的Tests脚本中提取数据
在第一个接口的 Tests 标签页中,解析响应JSON并保存到环境变量:
javascript
// 验证响应状态和内容
pm.test("Status code is 200 and contains token", function () {
pm.response.to.have.status(200);
pm.expect(pm.response.text()).to.include("token");
});
// 提取token和user_id
var jsonData = pm.response.json();
pm.environment.set("_token", jsonData.result.token); // 根据实际响应结构调整
pm.environment.set("_userid", jsonData.result.user_id);
在后续接口中使用保存的变量
在后续接口的请求参数(如URL、请求头、Body)中,使用{{_token}}、{{_userid}}的方式引用前面设置的变量。
脚本管理和调试
复用预请求脚本:将通用的预请求脚本(如通用的签名函数)保存在集合(Collection) 级别或环境变量中,可避免重复编写。例如,可以将一个复杂的签名函数postmanUtil定义为环境变量,然后在各个请求的预请求脚本中通过eval(environment.postmanUtil);调用。
善用控制台:在预请求脚本中使用console.log()输出调试信息,然后在Postman控制台(View -> Show Postman Console)查看,这对排查脚本问题非常有帮助。
提醒注意
注意执行顺序:预请求脚本在请求发送前执行,Tests脚本在收到响应后执行。
变量作用域:pm.environment.set用于设置环境变量,pm.collectionVariables.set用于设置集合变量。环境变量适用于特定环境(如测试、生产),集合变量在该集合内可用。根据需求选择合适的变量。
加密算法选择:确认接口要求的加密算法(如HMAC-SHA1、HMAC-SHA256、MD5),确保预请求脚本中使用的算法和接口要求一致。