安装
使用过程遇到的问题及解决方案
-
postman中需要动态生成digest,规则是:算法 MD5(uri+timestamp) 32位大写
在 Postman 中,如果需要使用变量timestamp来动态生成请求参数或请求头,可以通过以下几种方式实现:- 使用动态变量(推荐)
Postman 提供了内置的动态变量{{$timestamp}},可以直接生成当前时间的时间戳(以秒为单位)。使用方法:-
在请求的 URL、请求头或请求体中,直接使用
{{$timestamp}}。例如:- URL:
https://api.example.com/data?timestamp={{$timestamp}} - 请求头:
Timestamp: {{$timestamp}} - 请求体:
{"timestamp": "{{$timestamp}}"}
- URL:
- 使用预请求脚本动态生成
timestamp
如果需要更灵活的时间戳格式(如毫秒级时间戳或自定义格式),可以通过预请求脚本(Pre-request Script)动态生成并设置变量。步骤:- 打开请求的“Pre-request Script”标签。
- 编写 JavaScript 代码生成
timestamp并存储到变量中。例如: - javascript
- 复制
- // 生成当前时间的时间戳(以秒为单位)const timestamp = Math.floor(Date.now() / 1000);// 将 timestamp 存储到环境变量或全局变量 pm.environment.set("timestamp", timestamp);
- 如果需要毫秒级时间戳:
- javascript
- 复制
- const timestamp = Date.now(); pm.environment.set("timestamp", timestamp);
- 如果需要自定义格式的时间戳:
- javascript
- 复制
- const now = new Date();const timestamp = now.toISOString(); // 例如:2023-10-05T12:34:56.789Z pm.environment.set("timestamp", timestamp);
- 在请求中引用变量
{{timestamp}},如 URL、请求头或请求体。
- 使用环境变量或全局变量
如果timestamp是一个固定的值,可以将其存储在环境变量或全局变量中,然后在请求中引用。步骤:-
设置变量:
- 点击右上角的“Environment”图标,创建一个新的环境或选择现有环境。
- 在变量列表中,添加一个变量(如
timestamp),并设置其值。
-
引用变量:
-
在请求的 URL、请求头或请求体中,使用双花括号
{{variable_name}}引用变量。例如:- URL:
https://api.example.com/data?timestamp={{timestamp}} - 请求头:
Timestamp: {{timestamp}} - 请求体:
{"timestamp": "{{timestamp}}"}
- URL:
-
- 使用集合变量
如果timestamp在多个请求中共享,可以将其设置为集合变量(Collection Variable)。步骤:- 打开集合(Collection)的设置页面。
- 在“Variables”标签下,添加一个变量(如
timestamp),并设置其值。 - 在请求中引用集合变量
{{timestamp}}。
- 结合外部数据源
如果timestamp需要从外部数据源(如 CSV 文件或 JSON 文件)获取,可以使用 Postman 的数据文件功能。步骤:- 准备一个 CSV 或 JSON 文件,包含
timestamp的值。 - 在 Collection Runner 中上传数据文件。
-
在请求中引用数据文件中的变量。例如:
- CSV 文件:
- csv
- 复制
- timestamp16965216001696525200
- 请求中引用:
{{data.timestamp}}
总结- 如果
timestamp需要当前时间的时间戳,直接使用动态变量{{$timestamp}}。 - 如果需要更灵活的时间戳格式,使用预请求脚本动态生成。
- 如果
timestamp是固定值,使用环境变量或全局变量。 - 如果
timestamp在多个请求中共享,使用集合变量。 - 如果需要从外部数据源获取,使用数据文件功能。
-
postman uri+时间戳 MD5 3位动态生成digest
在Postman中动态生成MD5 Digest的步骤如下:
- 在Pre-request Script中添加脚本
// 获取URI(示例需要根据实际情况调整)const url = pm.request.url.getPathWithQuery(); // 包含路径和查询参数的URI// 或 pm.request.url.getPath(); // 仅路径// 生成时间戳(秒级)const timestamp = Math.floor(Date.now() / 1000);
// 拼接字符串const rawString = url + timestamp;
// 计算MD5哈希(32位大写)const crypto = require('crypto');
const hash = crypto.createHash('md5').update(rawString).digest('hex').toUpperCase();
// 设置环境变量
pm.environment.set("digest", hash);
pm.environment.set("timestamp", timestamp);
- 使用变量
在请求的:
- Headers中:
Digest: {{digest}} - Params/Body中:
timestamp={{timestamp}}
关键点说明:
-
URI获取:
getPathWithQuery()包含路径和查询参数,如/api/v1/data?page=1getPath()仅包含路径,如/api/v1/data
-
时间戳格式:
- 当前代码使用秒级时间戳(10位数字)
- 如需毫秒级,改为
Date.now()并移除/1000
-
编码验证:
- 建议先用固定值测试哈希是否与服务端一致
- 在线验证工具:https://www.md5hashgenerator.com
常见问题排查:
// 调试输出(View -> Show Postman Console)console.log("Raw string:", rawString);
console.log("MD5 Hash:", hash);
如果服务端要求其他格式(如base64编码),可将
.digest('hex')改为.digest('base64'),但需保持32位十六进制字符串时使用hex格式。-
所有的接口请求都需要这样的digest,怎样设置公共变量使用?
在Postman中为所有接口统一设置Digest鉴权,可以通过 集合级脚本(Collection-level Script) + 环境变量 实现全局复用。具体操作如下:
方案一:集合级脚本(推荐)
原理:通过集合的
Pre-request Script 自动为所有子请求生成Digest步骤:
-
创建/选择集合
- 右键点击集合 -> 选择 Edit
- 进入 Pre-request Scripts 标签
- 添加全局脚本
// 获取URI(含参数)
const uri = pm.request.url.getPathWithQuery();
// 生成时间戳(秒级,与服务端对齐)
const timestamp = Math.floor(Date.now() / 1000);
// 计算MD5(uri+timestamp)
const rawString = uri + timestamp;
const digest = CryptoJS.MD5(rawString).toString().toUpperCase(); // 关键修改点
// 设置环境变量
pm.environment.set("digest", digest);
pm.environment.set("timestamp", timestamp);
// 调试输出(View -> Show Postman Console)
console.log("RAW STRING:", rawString);
console.log("DIGEST:", digest);
-
在请求中引用变量
- Headers中添加:
Digest: {{digest}} - Params/Body中添加:
timestamp={{timestamp}}
- Headers中添加:
- 环境隔离(可选) 如果不同环境(如测试/生产)需要独立变量,创建多个环境并在脚本中动态切换:
// 示例:根据环境选择前缀
const env = pm.environment.get("env");
const baseUrl = pm.environment.get(`${env}_base_url`);
方案二:全局函数封装(高阶用法)
如果需复用更复杂的逻辑,可封装为全局函数:
- 在集合脚本中定义函数
function generateDigest() {
const uri = pm.request.url.getPathWithQuery();
const timestamp = Math.floor(Date.now());
const rawString = uri + timestamp;
const digest = CryptoJS.MD5(rawString).toString().toUpperCase(); // 关键修改点
}
// 将函数挂载到全局对象
pm.globals.set('generateDigest', generateDigest.toString());
- 在单个请求的Pre-request Script中调用
// 调用全局函数const digest = eval(pm.globals.get('generateDigest'))();
pm.environment.set("digest", digest);
关键配置建议
- 统一请求头设置
在集合的 Headers 中预设:
Key: Digest
Value: {{digest}}
- 自动同步时间戳
在URL Params或Body中自动添加时间戳:
// 示例URL
https://api.com/endpoint?timestamp={{timestamp}}
- 环境管理
为不同环境(测试/生产)创建独立的环境配置,确保变量隔离:
| 环境变量 | 示例值 |
| digest | (自动生成) |
| timestamp | (自动生成) |
调试技巧
- 查看实时变量值
// 在脚本中添加调试输出
console.log("Digest:", pm.environment.get("digest"));
console.log("Timestamp:", pm.environment.get("timestamp"));
- 通过 View -> Show Postman Console 查看日志
- 强制刷新变量 在请求前手动清除旧值(可选):
pm.environment.unset("digest");
pm.environment.unset("timestamp");
例外处理
如果某些接口不需要Digest,可在对应请求的 Pre-request Script 中覆盖逻辑:
// 清空集合级脚本的变量
pm.environment.unset("digest");
pm.environment.unset("timestamp");
```
-
postman请求中,如何设置公共header
在 Postman 中为所有请求统一设置公共 Header,可以通过以下 4 种方式实现(推荐优先级排序):
方法 1:集合级别全局 Header(最常用)
适用场景:所有接口都需要携带相同 Header(如 Authorization、Digest 等)
操作步骤:
- 右键点击集合 -> 选择 Edit
- 进入 Headers 标签
- 添加公共 Header:
Key: Digest
Value: {{digest}} # 使用动态生成的环境变量
Key: Content-Type
Value: application/json
Key: X-Request-ID
Value: {{$guid}} # 使用Postman内置动态变量生成UUID
效果:该集合下的所有请求自动继承这些 Header
方法 2:文件夹级继承 Header
适用场景:不同接口分组需要不同 Header
操作步骤:
- 右键点击文件夹 -> 选择 Edit
- 进入 Headers 标签添加专属 Header:
Key: API-Version
Value: v2.0
优先级:请求级 Header > 文件夹级 Header > 集合级 Header
方法 3:通过脚本动态设置(高阶用法)
适用场景:需要复杂逻辑生成的 Header(如动态签名)
在集合的 Pre-request Script 中添加:
// 设置动态Header示例
pm.request.headers.add({
key: 'X-Timestamp',
value: Date.now().toString()
});
// 通过环境变量设置签名Header
const signature = CryptoJS.MD5(pm.request.url.getPathWithQuery()).toString();
pm.request.headers.add({
key: 'X-Signature',
value: signature
});
方法 4:全局变量 + 模板继承
适用场景:多环境共用 Header 模板
- 设置全局变量:
// 在集合脚本中初始化
pm.globals.set("auth_token", "Bearer xyz");
- 在集合 Headers 中使用:
Key: Authorization
Value: {{auth_token}}
最佳实践技巧
- 动态变量优先级控制
# 在请求中覆盖集合级Header(局部优先)
Key: Content-Type
Value: text/xml # 覆盖集合级的application/json
- 条件式 Header 管理
// 在Pre-request Script中根据环境判断if (pm.environment.get("env") === "prod") {
pm.request.headers.add({
key: 'X-Strict-Mode',
value: 'enabled' });
}
- 敏感信息保护
// 通过环境变量引用机密Header(不在代码中明文存储)pm.request.headers.add({
key: 'API-Key',
value: pm.environment.get("secret_api_key") // 从环境变量读取});
调试与验证
-
查看最终 Header:
- 发送请求前在 Headers 标签查看合并后的结果
- 通过控制台查看完整请求头(
View -> Show Postman Console)
- 脚本调试输出:
// 打印当前所有Headerconsole.log("Current Headers:", pm.request.headers);
架构示意图
全局 Header 系统
├─ 集合级 Header(基础鉴权)
├─ 文件夹级 Header(业务分组配置)
├─ 请求级 Header(特殊覆盖)
└─ 脚本动态 Header(逻辑生成)
-
在 Postman 中实现接口返回值传递到下一个接口的入参
在 Postman 中实现接口返回值传递到下一个接口的入参,核心是通过 环境变量/全局变量 中转数据。以下是具体操作步骤:
一、基础用法:单接口传值
场景示例
- 接口A(登录):返回
token - 接口B(查询用户信息):请求头需要携带
Authorization: Bearer {{token}}
操作步骤
- 在接口A的Tests脚本中提取值:
//示例响应:{ "code": 200, "data": { "token": "abc123" } }
// 提取响应中的token
const token = pm.response.json().data.token;
// 保存到环境变量
pm.environment.set("token", token);
// 调试输出(View -> Show Postman Console)
console.log("Saved token:", pm.environment.get("token"));
-
在接口B中引用变量:
- 请求头:
Key: AuthorizationValue: Bearer {{token}}- 或请求体:
{"user_token": "{{token}}"}
二、高阶用法:动态参数处理
场景1:提取数组中的值
// 响应示例:{ "items": [{"id": 101}, {"id": 102}] }// 提取第一个元素的idconst firstId = pm.response.json().items[0].id;
pm.environment.set("first_item_id", firstId);
场景2:处理XML响应
// 需要先安装Postman的xml2Json库(自带)const xmlResponse = pm.response.text();
const jsonData = xml2Json(xmlResponse);
const value = jsonData.root.element.value;
pm.environment.set("xml_value", value);
场景3:正则表达式提取
// 从HTML/文本响应中提取数据const html = pm.response.text();
const match = html.match(/(\d+)<\/span>/);
if (match) {
pm.environment.set("price", match[1]);
}
三、自动化流程:集合运行
若需批量执行多个接口并传递参数,使用 Collection Runner:
- 在集合中添加顺序请求:
接口A(获取token) → 接口B(使用token) → 接口C(使用接口B的结果)
-
设置集合级脚本:
- Pre-request Script:初始化变量
pm.environment.unset("token"); // 清理旧数据- Tests Script:传递复杂逻辑
// 接口B的Tests脚本中提取数据const userId = pm.response.json().user.id; pm.environment.set("user_id", userId); -
运行集合:
- 打开集合 → 点击 Run collection
- 勾选 Save Responses 以便调试
四、最佳实践
- 变量作用域管理
| 变量类型 | 适用场景 | 操作命令 |
| 环境变量 | 不同环境(测试/生产)隔离 | pm.environment.set() |
| 全局变量 | 跨集合共享数据 | pm.globals.set() |
| 局部变量 | 单次运行临时存储 | pm.variables.set() |
- 错误处理
// 检查响应是否有效再提取if (pm.response.code === 200) {
const data = pm.response.json();
if (data && data.token) {
pm.environment.set("token", data.token);
} else {
console.error("Token not found in response");
}
} else {
console.error("Request failed:", pm.response.code);
}
- 参数清理
在测试结束后清除敏感数据:
// 在集合的Tests脚本或单独接口中添加
pm.environment.unset("token");
pm.globals.unset("secret_key");
五、调试技巧
- 实时查看变量:
// 在脚本中打印变量
console.log("Current token:", pm.environment.get("token"));
-
手动设置变量:
- 环境面板中直接修改变量值(右上角眼睛图标)
- Mock服务验证: 使用 Postman Mock Server 模拟固定响应,测试提取逻辑
六、架构示意图
接口A(登录)
│
▼
[提取token → 存入环境变量]
│
▼
接口B(查询用户) → 使用{{token}}
│
▼
[提取用户ID → 存入变量]
│
▼
接口C(订单查询)→ 使用{{user_id}}
-
在 Postman 中重复多次执行一个请求来生成测试数据
方法 1:使用 Collection Runner(集合运行器)
- 将请求保存到集合 将需要重复执行的请求保存到一个集合(Collection)中。
-
配置迭代次数
- 打开集合右侧的
...→ 选择 Run collection。 -
在运行界面中:
- 设置迭代次数(
Iterations):输入需要重复执行的次数。 - 设置延迟(
Delay):可选,控制每次请求的间隔时间(毫秒)。 - 点击 Run 开始执行。
- 设置迭代次数(
- 打开集合右侧的
- 动态数据(可选) 如果需要每次请求参数不同(如生成随机数据),可以在请求参数中使用 Postman 的动态变量,例如:
// 请求 Body 或 Params 中使用动态变量
{
"name": "user{{$randomInt}}",
"email": "test{{$randomInt}}@example.com"
}
方法 2:使用 Pre-request Script(预请求脚本)
在请求的 Pre-request Script 标签页中编写脚本,通过循环发送请求:
// 示例:重复执行 10 次
const times = 10;
for (let i = 0; i < times; i++) {
// 发送请求(需异步处理)
pm.sendRequest({
url: pm.request.url, // 当前请求的 URL
method: pm.request.method,
body: pm.request.body
}, (err, res) => {
if (err) console.error(err);
else console.log(`第 ${i + 1} 次请求完成`);
});
}
注意:此方法需要处理异步请求,可能不适用于高频次请求(需调整延迟)。
方法 3:使用 Newman(命令行工具)
如果需要在 CI/CD 或脚本中批量运行,可以用 Postman 的命令行工具 Newman:
- 导出集合和环境变量。
- 运行命令:
newman run your_collection.json -n 10 # -n 指定迭代次数
方法 4:设置延迟循环(基于 setNextRequest)
在请求的 Tests 标签页中编写脚本,实现循环逻辑:
// 定义最大执行次数和当前计数器let counter = parseInt(pm.environment.get("counter") || 0);
const maxRuns = 10; // 总次数if (counter < maxRuns) {
pm.environment.set("counter", counter + 1);
postman.setNextRequest("Your_Request_Name"); // 指定当前请求名称
} else {
postman.setNextRequest(null); // 停止循环
pm.environment.unset("counter");
}
注意事项
- 数据唯一性:若需生成唯一数据(如用户名、邮箱),建议使用动态变量(如
{{$guid}}或时间戳)。 - 服务器压力:高频次请求可能触发服务器限流,需合理设置延迟。
- 认证与权限:确保请求的 Token 或 Cookie 在多次调用中有效。
-
Postman 拦截请求并模拟返回数据常见方法实现
方法一:使用 Postman 的 Mock Server(模拟服务器)
适用场景:需要长期或重复使用模拟数据,且系统能直接调用 Mock 接口的 URL。 步骤:
-
创建集合(Collection)
- 在 Postman 中新建一个 Collection(如
Mock API)。
- 在 Postman 中新建一个 Collection(如
-
定义示例响应(Example)
- 在集合中添加请求(如
GET /user),然后在请求的 Examples 中设置你希望模拟的返回值(如状态码、JSON 数据等)。
- 在集合中添加请求(如
-
生成 Mock Server
- 点击集合右侧的 ... → Mock Collection → 配置 Mock Server 名称和环境(默认即可)→ 点击 Create Mock Server。
- Postman 会生成一个 Mock Server 的 URL(如
https://xxxx.mock.pstmn.io)。
-
修改系统请求地址
- 将系统中原本请求的后端地址替换为 Mock Server 的 URL(需开发配合或通过代理工具拦截修改请求)。
-
验证
- 系统调用
https://xxxx.mock.pstmn.io/user时,会直接返回你预设的模拟数据。
- 系统调用
方法二:使用 Postman 代理 + 拦截工具(实时修改响应)
适用场景:需要实时拦截请求并动态修改响应(如测试异常场景)。 工具组合:Postman 代理 + Charles/Fiddler(抓包工具)或 Postman 拦截器(需配合浏览器扩展)。 步骤:
-
设置 Postman 代理
- 打开 Postman → 右上角 Capture requests → 选择 Via Proxy。
- 设置代理端口(如
5555),并启动代理。
-
配置系统代理
- 将测试系统的网络代理设置为你的电脑 IP 和端口(如
192.168.1.10:5555),确保流量经过 Postman。
- 将测试系统的网络代理设置为你的电脑 IP 和端口(如
-
使用抓包工具拦截请求(以 Charles 为例)
- 启动 Charles → 设置代理与 Postman 一致(端口
5555)。 - 在 Charles 中启用 Breakpoints(断点功能),针对目标 API 路径设置断点。
- 启动 Charles → 设置代理与 Postman 一致(端口
-
拦截并修改响应
- 当系统发送请求时,Charles 会暂停请求 → 右键选择 Edit Response → 修改响应体或状态码 → 点击 Execute 继续。
-
验证
- 系统会接收到你修改后的模拟数据。
方法三:Postman 拦截器 + 脚本(仅限浏览器)
适用场景:快速在浏览器中拦截并修改 API 响应(需安装 Postman 拦截器扩展)。 步骤:
-
安装 Postman 拦截器
- 在 Chrome 或 Edge 中安装 Postman Interceptor 扩展。
-
同步 Cookie 和 Header
- 打开 Postman → 点击右上角拦截器图标 → 启用 Interceptor 并连接浏览器。
-
捕获和修改请求
- 在浏览器中触发 API 请求 → Postman 会捕获到该请求。
- 在 Postman 中编辑请求的 Tests 或 Pre-request Script,动态生成模拟数据并发送(需编写脚本)。
注意事项
-
HTTPS 解密:
- 若拦截 HTTPS 请求,需在抓包工具(如 Charles)中安装 SSL 证书(方法参考工具文档)。
-
环境隔离:
- 确保仅在测试环境操作,避免影响生产环境。
-
动态数据模拟:
- 在 Postman 中使用
pm.response.set()或Faker.js库生成动态模拟数据(需编写脚本)。
- 在 Postman 中使用
根据你的需求选择合适的方法:
- 快速模拟固定数据 → 使用 Mock Server。
- 实时修改动态响应 → 使用 代理 + 抓包工具。
- 浏览器端调试 → 使用 Postman 拦截器。
posted on
浙公网安备 33010602011771号