当前位置: 首页 > news >正文

Postman 请求前置脚本

文章目录

    • 一、核心概念:为什么需要前置脚本?
    • 二、前置脚本的执行时机(关键!)
    • 三、实战:“时间戳10分钟校验”的前置脚本实现
      • 1. 场景拆解:要做什么?
      • 2. 脚本代码(带详细注释)
      • 3. 如何让请求用上前置脚本的时间戳?
      • 4. 调试技巧:看脚本是否执行成功
    • 四、补充:实际项目中的“服务器时间”怎么获取?
    • 五、前置脚本的其他常用场景(扩展)
    • 六、关键知识点总结(笔记核心)


Postman 的“请求前置脚本”(Pre-request Script),本质是在你点击“Send”发送请求后、Postman 真正发起 HTTP 请求前,自动执行的一段 JavaScript 代码。它就像请求的“前置检查/准备环节”,能帮你提前处理数据(比如生成时间戳、拼接参数)、校验条件(比如判断时间是否合法),避免无效请求发送。

一、核心概念:为什么需要前置脚本?

先拿“时间戳校验”场景举例:
假设你要调用一个接口,接口要求必须传“当前时间戳”,且这个时间戳和服务器标准时间的差距不能超过10分钟(超过就拒绝服务)。

如果没有前置脚本,你得手动做两件事:

  1. 查当前时间戳(比如用在线工具生成);
  2. 算一下这个时间戳和“服务器时间”的差距(还得先知道服务器当前时间,很麻烦);
    万一算错了,点了 Send 才被接口拒绝,白做一次无效请求。

而前置脚本能帮你自动完成“生成时间戳+校验差距” ——如果时间不合法,直接在 Postman 里弹窗提醒,根本不发请求,省时间还避免报错。

二、前置脚本的执行时机(关键!)

你笔记里“在 send 按钮点击后,请求迁至脚本代码,第一时间被执行”的描述可以再精准补充:
完整执行流程(按顺序):

  1. 你在 Postman 里填好请求地址、参数,点击「Send」按钮;
  2. Postman 先触发“前置脚本”(Pre-request Script 面板的代码),优先执行;
  3. 前置脚本执行完成后,Postman 才会把请求参数、 headers 等打包,发起真正的 HTTP 请求(往服务器发数据);
  4. 服务器返回响应后,才会执行“后置脚本”(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) 把时间戳存到了“环境变量”里,请求参数要这样引用:

  1. 在 Postman 顶部创建一个“环境”(比如叫“测试环境”),确保已选中;
  2. 在请求的「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」查看
时间戳场景关键先获取服务器时间 → 算差距 → 合法则赋值,不合法则阻止请求
http://www.dtcms.com/a/456777.html

相关文章:

  • 前端学AI:如何写好提示词(prompt)
  • Typescript》》TS》》Typescript 3.8 import 、import type
  • Python全栈(基础篇)——Day07:后端内容(函数的参数+递归函数+实战演示+每日一题)
  • 对抗样本:深度学习的隐秘挑战与防御之道
  • 通用:MySQL-InnoDB事务及ACID特性
  • 重庆江津网站建设企业专业网站设计公
  • 天津市武清区住房建设网站临沂天元建设集团网站
  • MySQL 锁机制深度解析:原理、场景、排查与优化​
  • Spring 的统一功能
  • 忘记php网站后台密码wordpress 医院模板下载
  • asp 网站卡死网站域名解析ip
  • Linux小课堂: 在 VirtualBox 虚拟机中安装 CentOS 7 的完整流程与关键技术详解
  • 单片机keilC51与MDK共存的方法(成功)
  • [Docker集群] Docker 容器入门
  • 分子动力学--不同拮抗剂与5-HT1AR结合机制的研究:一项分子对接与分子动力学模拟分析
  • 让压测回归简单:体验 PerfTest 分布式模式的“开箱即用”
  • 珠海网站制作定制企查查企业信息查询网页版
  • ZooKeeper源码分析与实战-模块五:原理篇
  • ZooKeeper源码分析与实战-模块四:实战篇
  • 元宇宙的医疗健康应用:重构诊疗、康复与研究
  • 建设外贸购物网站如何在网站做引流
  • 珠宝网站策划书做网站怎么赚钱吗
  • K-means损失函数-收敛证明
  • 如何看网站是不是织梦做的建一家网站多少钱
  • 通讯录的实现
  • CTFHub SQL注入通关笔记5:时间盲注(手注法+脚本法)
  • Excel表格批注提取器-网页版源码
  • 【机器学习】无监督学习 —— K-Means 聚类、DBSCAN 聚类
  • 【深入浅出PyTorch】--3.2.PyTorch组成模块2
  • [C++] --- 常用设计模式