Postman 请求前置脚本
文章目录
- 一、核心概念:为什么需要前置脚本?
- 二、前置脚本的执行时机(关键!)
- 三、实战:“时间戳10分钟校验”的前置脚本实现
- 1. 场景拆解:要做什么?
- 2. 脚本代码(带详细注释)
- 3. 如何让请求用上前置脚本的时间戳?
- 4. 调试技巧:看脚本是否执行成功
- 四、补充:实际项目中的“服务器时间”怎么获取?
- 五、前置脚本的其他常用场景(扩展)
- 六、关键知识点总结(笔记核心)
Postman 的“请求前置脚本”(Pre-request Script),本质是在你点击“Send”发送请求后、Postman 真正发起 HTTP 请求前,自动执行的一段 JavaScript 代码。它就像请求的“前置检查/准备环节”,能帮你提前处理数据(比如生成时间戳、拼接参数)、校验条件(比如判断时间是否合法),避免无效请求发送。
一、核心概念:为什么需要前置脚本?
先拿“时间戳校验”场景举例:
假设你要调用一个接口,接口要求必须传“当前时间戳”,且这个时间戳和服务器标准时间的差距不能超过10分钟(超过就拒绝服务)。
如果没有前置脚本,你得手动做两件事:
- 查当前时间戳(比如用在线工具生成);
- 算一下这个时间戳和“服务器时间”的差距(还得先知道服务器当前时间,很麻烦);
万一算错了,点了 Send 才被接口拒绝,白做一次无效请求。
而前置脚本能帮你自动完成“生成时间戳+校验差距” ——如果时间不合法,直接在 Postman 里弹窗提醒,根本不发请求,省时间还避免报错。
二、前置脚本的执行时机(关键!)
你笔记里“在 send 按钮点击后,请求迁至脚本代码,第一时间被执行”的描述可以再精准补充:
完整执行流程(按顺序):
- 你在 Postman 里填好请求地址、参数,点击「Send」按钮;
- Postman 先触发“前置脚本”(Pre-request Script 面板的代码),优先执行;
- 前置脚本执行完成后,Postman 才会把请求参数、 headers 等打包,发起真正的 HTTP 请求(往服务器发数据);
- 服务器返回响应后,才会执行“后置脚本”(Tests 面板,用于断言响应是否正确)。
简单记:点 Send → 前置脚本先跑 → 发 HTTP 请求 → 后置脚本再跑。
三、实战:“时间戳10分钟校验”的前置脚本实现
1. 场景拆解:要做什么?
前置脚本需要完成3件事:
- 生成“当前本地时间戳”(接口要传的参数);
- 假设已知“服务器标准时间戳”(实际项目中可能需要先调用“获取服务器时间”的接口,这里先简化为固定值方便演示);
- 计算两个时间戳的差距,若超过10分钟(即 10601000 = 600000 毫秒),则弹窗警告,阻止请求(或不赋值时间戳,让请求因参数缺失失败)。
2. 脚本代码(带详细注释)
在 Postman 对应请求的「Pre-request Script」面板中,粘贴以下代码:
// 1. 生成当前本地时间戳(单位:毫秒,接口常用格式)
const localTimestamp = new Date().getTime();
console.log("当前本地时间戳:", localTimestamp); // 控制台打印,方便调试// 2. 模拟“服务器标准时间戳”(实际项目中需替换为:调用“获取服务器时间”接口的返回值)
// 注意:这里只是示例,真实场景要先通过前置脚本调用“查服务器时间”的接口,再取返回的时间戳
const serverTimestamp = new Date().getTime(); // 简化:假设本地时间和服务器时间一致,实际需替换// 3. 计算时间差的绝对值(避免正负,只看差距大小)
const timeDiff = Math.abs(localTimestamp - serverTimestamp); // 4. 设定“允许的最大时间差”:10分钟 = 10*60*1000 毫秒
const maxAllowedDiff = 10 * 60 * 1000; // 5. 校验:如果时间差超过10分钟,弹窗警告并终止后续逻辑
if (timeDiff > maxAllowedDiff) {// 弹窗提醒用户(Postman 专属方法,会在界面弹出提示框)pm.prompt("时间戳不合法!", `本地时间与服务器时间差距超过10分钟(当前差距:${timeDiff/1000}秒),请求已阻止`);// 关键:给时间戳参数赋值为空,让请求因“缺少必要参数”失败(避免无效请求发出去)pm.environment.set("timestamp", ""); // 假设接口用“环境变量timestamp”传参,这里清空
} else {// 时间合法:将本地时间戳存入“环境变量”,供请求参数使用pm.environment.set("timestamp", localTimestamp);console.log("时间戳合法,已存入环境变量");
}
3. 如何让请求用上前置脚本的时间戳?
脚本里用 pm.environment.set("timestamp", localTimestamp)
把时间戳存到了“环境变量”里,请求参数要这样引用:
- 在 Postman 顶部创建一个“环境”(比如叫“测试环境”),确保已选中;
- 在请求的「Params」(参数)或「Body」(请求体)中,把“时间戳”参数的值填为
{{timestamp}}
(双大括号引用环境变量);
这样一来:
- 若时间合法:
{{timestamp}}
会替换成有效的时间戳,请求正常发送; - 若时间不合法:
{{timestamp}}
是空值,接口会因“缺少时间戳参数”拒绝,避免无效请求。
4. 调试技巧:看脚本是否执行成功
- 点击「Send」后,打开 Postman 左下角的「Console」(控制台),可以看到
console.log
打印的“当前本地时间戳”等信息,判断脚本是否执行; - 若时间差超标,会弹出提示框,同时「Console」会显示变量赋值情况,方便定位问题。
四、补充:实际项目中的“服务器时间”怎么获取?
上面的示例中,我们简化了“服务器时间戳”的获取(直接用本地时间模拟),但真实场景中,服务器时间和本地时间可能有差距(比如用户本地时间被篡改),这时候需要在前置脚本中先调用“获取服务器时间”的接口,步骤如下:
// 真实场景:前置脚本先调用“查服务器时间”接口,再用返回的时间戳做校验
pm.sendRequest({url: "https://xxx.com/api/getServerTime", // 假设这是“获取服务器时间”的接口method: "GET" // 接口方法,可能是GET/POST
}, function (err, res) {// 接口调用成功后,从响应中取服务器时间戳const serverTimestamp = res.json().timestamp; // 假设响应是 { "timestamp": 1699999999999 }console.log("服务器时间戳:", serverTimestamp);// 后续逻辑不变:生成本地时间戳 → 算差距 → 校验...(同上一步的代码)const localTimestamp = new Date().getTime();const timeDiff = Math.abs(localTimestamp - serverTimestamp);const maxAllowedDiff = 10 * 60 * 1000;if (timeDiff > maxAllowedDiff) {pm.prompt("时间戳不合法!", "差距超过10分钟");pm.environment.set("timestamp", "");} else {pm.environment.set("timestamp", localTimestamp);}
});
这里用了 Postman 专属的 pm.sendRequest
方法,能在前置脚本里嵌套发送另一个请求(获取服务器时间),再基于这个请求的结果处理当前请求的逻辑,非常灵活。
五、前置脚本的其他常用场景(扩展)
除了时间戳校验,前置脚本还能做这些事:
- 自动生成签名(比如接口要求“参数+密钥”MD5加密,前置脚本自动拼接并加密,存入变量);
- 动态设置 headers(比如 token 过期后,自动调用“刷新token”接口,更新 headers 里的 token);
- 批量赋值参数(比如一次给多个参数设置随机值,避免手动输入)。
六、关键知识点总结(笔记核心)
核心点 | 通俗解释 |
---|---|
执行时机 | 点 Send 后 → 发 HTTP 请求前 |
核心作用 | 提前准备/校验数据,避免无效请求 |
常用工具方法 | pm.environment.set(key, value) :存环境变量;pm.sendRequest() :嵌套发请求;pm.prompt() :弹窗 |
调试方式 | 用 console.log() 打印信息,在 Postman 左下角「Console」查看 |
时间戳场景关键 | 先获取服务器时间 → 算差距 → 合法则赋值,不合法则阻止请求 |