安装

使用过程遇到的问题及解决方案

  1. postman中需要动态生成digest,规则是:算法 MD5(uri+timestamp) 32位大写

      在 Postman 中,如果需要使用变量 timestamp 来动态生成请求参数或请求头,可以通过以下几种方式实现:

    1. 使用动态变量(推荐)
      Postman 提供了内置的动态变量 {{$timestamp}},可以直接生成当前时间的时间戳(以秒为单位)。
      使用方法:
    • 在请求的 URL、请求头或请求体中,直接使用 {{$timestamp}}。例如:
      • URL:https://api.example.com/data?timestamp={{$timestamp}}
      • 请求头:Timestamp: {{$timestamp}}
      • 请求体:{"timestamp": "{{$timestamp}}"}

    1. 使用预请求脚本动态生成 timestamp
      如果需要更灵活的时间戳格式(如毫秒级时间戳或自定义格式),可以通过预请求脚本(Pre-request Script)动态生成并设置变量。
      步骤:
    1. 打开请求的“Pre-request Script”标签。
    2. 编写 JavaScript 代码生成 timestamp 并存储到变量中。例如:
    3. javascript
    4. 复制
    5. // 生成当前时间的时间戳(以秒为单位)const timestamp = Math.floor(Date.now() / 1000);// 将 timestamp 存储到环境变量或全局变量 pm.environment.set("timestamp", timestamp);
    6. 如果需要毫秒级时间戳:
    7. javascript
    8. 复制
    9. const timestamp = Date.now(); pm.environment.set("timestamp", timestamp);
    10. 如果需要自定义格式的时间戳:
    11. javascript
    12. 复制
    13. const now = new Date();const timestamp = now.toISOString(); // 例如:2023-10-05T12:34:56.789Z pm.environment.set("timestamp", timestamp);
    14. 在请求中引用变量 {{timestamp}},如 URL、请求头或请求体。

    1. 使用环境变量或全局变量
      如果 timestamp 是一个固定的值,可以将其存储在环境变量或全局变量中,然后在请求中引用。
      步骤:
    1. 设置变量
      1. 点击右上角的“Environment”图标,创建一个新的环境或选择现有环境。
      2. 在变量列表中,添加一个变量(如 timestamp),并设置其值。
    2. 引用变量
      1. 在请求的 URL、请求头或请求体中,使用双花括号 {{variable_name}} 引用变量。例如:
        • URL:https://api.example.com/data?timestamp={{timestamp}}
        • 请求头:Timestamp: {{timestamp}}
        • 请求体:{"timestamp": "{{timestamp}}"}

    1. 使用集合变量
      如果 timestamp 在多个请求中共享,可以将其设置为集合变量(Collection Variable)。
      步骤:
    1. 打开集合(Collection)的设置页面。
    2. 在“Variables”标签下,添加一个变量(如 timestamp),并设置其值。
    3. 在请求中引用集合变量 {{timestamp}}

    1. 结合外部数据源
      如果 timestamp 需要从外部数据源(如 CSV 文件或 JSON 文件)获取,可以使用 Postman 的数据文件功能。
      步骤:
    1. 准备一个 CSV 或 JSON 文件,包含 timestamp 的值。
    2. 在 Collection Runner 中上传数据文件。
    3. 在请求中引用数据文件中的变量。例如:
      1. CSV 文件:
      2. csv
      3. 复制
      4. timestamp16965216001696525200
      5. 请求中引用:{{data.timestamp}}

      总结
    • 如果 timestamp 需要当前时间的时间戳,直接使用动态变量 {{$timestamp}}
    • 如果需要更灵活的时间戳格式,使用预请求脚本动态生成。
    • 如果 timestamp 是固定值,使用环境变量或全局变量。
    • 如果 timestamp 在多个请求中共享,使用集合变量。
    • 如果需要从外部数据源获取,使用数据文件功能。
  1. postman uri+时间戳 MD5 3位动态生成digest

在Postman中动态生成MD5 Digest的步骤如下:
  1. 在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);
  1. 使用变量
在请求的:
  • Headers中:Digest: {{digest}}
  • Params/Body中:timestamp={{timestamp}}
关键点说明:
  1. URI获取
    1. getPathWithQuery() 包含路径和查询参数,如 /api/v1/data?page=1
    2. getPath() 仅包含路径,如 /api/v1/data
  2. 时间戳格式
    1. 当前代码使用秒级时间戳(10位数字)
    2. 如需毫秒级,改为 Date.now() 并移除 /1000
  3. 编码验证
    1. 建议先用固定值测试哈希是否与服务端一致
    2. 在线验证工具: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格式。
  1. 所有的接口请求都需要这样的digest,怎样设置公共变量使用?

在Postman中为所有接口统一设置Digest鉴权,可以通过 集合级脚本(Collection-level Script) + 环境变量 实现全局复用。具体操作如下:

方案一:集合级脚本(推荐)
原理:通过集合的 Pre-request Script 自动为所有子请求生成Digest
步骤:
  1. 创建/选择集合
    1. 右键点击集合 -> 选择 Edit
    2. 进入 Pre-request Scripts 标签
  2. 添加全局脚本
// 获取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);
  1. 在请求中引用变量
    1. Headers中添加:Digest: {{digest}}
    2. Params/Body中添加:timestamp={{timestamp}}
  2. 环境隔离(可选) 如果不同环境(如测试/生产)需要独立变量,创建多个环境并在脚本中动态切换:
// 示例:根据环境选择前缀
const env = pm.environment.get("env");
const baseUrl = pm.environment.get(`${env}_base_url`);

方案二:全局函数封装(高阶用法)
如果需复用更复杂的逻辑,可封装为全局函数:
  1. 在集合脚本中定义函数
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());
  1. 在单个请求的Pre-request Script中调用
// 调用全局函数const digest = eval(pm.globals.get('generateDigest'))();
pm.environment.set("digest", digest);

关键配置建议
  1. 统一请求头设置
在集合的 Headers 中预设:
Key: Digest
Value: {{digest}}
  1. 自动同步时间戳
在URL Params或Body中自动添加时间戳:
// 示例URL
https://api.com/endpoint?timestamp={{timestamp}}
  1. 环境管理
为不同环境(测试/生产)创建独立的环境配置,确保变量隔离:
环境变量 示例值
digest (自动生成)
timestamp (自动生成)

调试技巧
  1. 查看实时变量值
// 在脚本中添加调试输出
console.log("Digest:", pm.environment.get("digest"));
console.log("Timestamp:", pm.environment.get("timestamp"));
  1. 通过 View -> Show Postman Console 查看日志
  2. 强制刷新变量 在请求前手动清除旧值(可选):
pm.environment.unset("digest");
pm.environment.unset("timestamp");

例外处理
如果某些接口不需要Digest,可在对应请求的 Pre-request Script 中覆盖逻辑:
// 清空集合级脚本的变量
pm.environment.unset("digest");
pm.environment.unset("timestamp");
```
  1. postman请求中,如何设置公共header

在 Postman 中为所有请求统一设置公共 Header,可以通过以下 4 种方式实现(推荐优先级排序):

方法 1:集合级别全局 Header(最常用)
适用场景:所有接口都需要携带相同 Header(如 Authorization、Digest 等)
操作步骤:
  1. 右键点击集合 -> 选择 Edit
  2. 进入 Headers 标签
  3. 添加公共 Header:
Key: Digest
Value: {{digest}}  # 使用动态生成的环境变量

Key: Content-Type
Value: application/json

Key: X-Request-ID
Value: {{$guid}}  # 使用Postman内置动态变量生成UUID
效果:该集合下的所有请求自动继承这些 Header

方法 2:文件夹级继承 Header
适用场景:不同接口分组需要不同 Header
操作步骤:
  1. 右键点击文件夹 -> 选择 Edit
  2. 进入 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 模板
  1. 设置全局变量
// 在集合脚本中初始化
pm.globals.set("auth_token", "Bearer xyz");
  1. 在集合 Headers 中使用
Key: Authorization
Value: {{auth_token}}

最佳实践技巧
  1. 动态变量优先级控制
# 在请求中覆盖集合级Header(局部优先)
Key: Content-Type
Value: text/xml  # 覆盖集合级的application/json
  1. 条件式 Header 管理
// 在Pre-request Script中根据环境判断if (pm.environment.get("env") === "prod") {
    pm.request.headers.add({
key: 'X-Strict-Mode',
value: 'enabled'    });
}
  1. 敏感信息保护
// 通过环境变量引用机密Header(不在代码中明文存储)pm.request.headers.add({
key: 'API-Key',
value: pm.environment.get("secret_api_key")  // 从环境变量读取});

调试与验证
  1. 查看最终 Header
    1. 发送请求前在 Headers 标签查看合并后的结果
    2. 通过控制台查看完整请求头(View -> Show Postman Console
  2. 脚本调试输出
// 打印当前所有Headerconsole.log("Current Headers:", pm.request.headers);

架构示意图
全局 Header 系统
├─ 集合级 Header(基础鉴权)
├─ 文件夹级 Header(业务分组配置)
├─ 请求级 Header(特殊覆盖)
└─ 脚本动态 Header(逻辑生成)
 
  1. 在 Postman 中实现接口返回值传递到下一个接口的入参

在 Postman 中实现接口返回值传递到下一个接口的入参,核心是通过 环境变量/全局变量 中转数据。以下是具体操作步骤:

一、基础用法:单接口传值
场景示例
  1. 接口A(登录):返回 token
  2. 接口B(查询用户信息):请求头需要携带 Authorization: Bearer {{token}}
操作步骤
  1. 在接口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"));
  1. 在接口B中引用变量
      1. 请求头:
    Key: AuthorizationValue: Bearer {{token}}
      1. 或请求体:
    {"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
  1. 在集合中添加顺序请求
接口A(获取token) → 接口B(使用token) → 接口C(使用接口B的结果)
  1. 设置集合级脚本
      1. Pre-request Script:初始化变量
    pm.environment.unset("token"); // 清理旧数据
      1. Tests Script:传递复杂逻辑
    // 接口B的Tests脚本中提取数据const userId = pm.response.json().user.id;
    pm.environment.set("user_id", userId);
  2. 运行集合
    1. 打开集合 → 点击 Run collection
    2. 勾选 Save Responses 以便调试

四、最佳实践
  1. 变量作用域管理
变量类型 适用场景 操作命令
环境变量 不同环境(测试/生产)隔离 pm.environment.set()
全局变量 跨集合共享数据 pm.globals.set()
局部变量 单次运行临时存储 pm.variables.set()
  1. 错误处理
// 检查响应是否有效再提取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);
}
  1. 参数清理
在测试结束后清除敏感数据:
// 在集合的Tests脚本或单独接口中添加
pm.environment.unset("token");
pm.globals.unset("secret_key");

五、调试技巧
  1. 实时查看变量
// 在脚本中打印变量
console.log("Current token:", pm.environment.get("token"));
  1. 手动设置变量
    1. 环境面板中直接修改变量值(右上角眼睛图标)
  2. Mock服务验证: 使用 Postman Mock Server 模拟固定响应,测试提取逻辑

六、架构示意图
接口A(登录)
  │
  ▼
[提取token → 存入环境变量]
  │
  ▼
接口B(查询用户) → 使用{{token}}
  │
  ▼
[提取用户ID → 存入变量]
  │
  ▼
接口C(订单查询)→ 使用{{user_id}}
  1. 在 Postman 中重复多次执行一个请求来生成测试数据

方法 1:使用 Collection Runner(集合运行器)
  1. 将请求保存到集合 将需要重复执行的请求保存到一个集合(Collection)中。
  2. 配置迭代次数
    1. 打开集合右侧的 ... → 选择 Run collection
    2. 在运行界面中:
      • 设置迭代次数(Iterations):输入需要重复执行的次数。
      • 设置延迟(Delay):可选,控制每次请求的间隔时间(毫秒)。
      • 点击 Run 开始执行。
  3. 动态数据(可选) 如果需要每次请求参数不同(如生成随机数据),可以在请求参数中使用 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
  1. 导出集合和环境变量。
  2. 运行命令:
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");
}

注意事项
  1. 数据唯一性:若需生成唯一数据(如用户名、邮箱),建议使用动态变量(如 {{$guid}} 或时间戳)。
  2. 服务器压力:高频次请求可能触发服务器限流,需合理设置延迟。
  3. 认证与权限:确保请求的 Token 或 Cookie 在多次调用中有效。
 
  1. Postman 拦截请求并模拟返回数据常见方法实现

方法一:使用 Postman 的 Mock Server(模拟服务器)
适用场景:需要长期或重复使用模拟数据,且系统能直接调用 Mock 接口的 URL。 步骤
  1. 创建集合(Collection)
    1. 在 Postman 中新建一个 Collection(如 Mock API)。
  2. 定义示例响应(Example)
    1. 在集合中添加请求(如 GET /user),然后在请求的 Examples 中设置你希望模拟的返回值(如状态码、JSON 数据等)。
  3. 生成 Mock Server
    1. 点击集合右侧的 ...Mock Collection → 配置 Mock Server 名称和环境(默认即可)→ 点击 Create Mock Server
    2. Postman 会生成一个 Mock Server 的 URL(如 https://xxxx.mock.pstmn.io)。
  4. 修改系统请求地址
    1. 将系统中原本请求的后端地址替换为 Mock Server 的 URL(需开发配合或通过代理工具拦截修改请求)。
  5. 验证
    1. 系统调用 https://xxxx.mock.pstmn.io/user 时,会直接返回你预设的模拟数据。

方法二:使用 Postman 代理 + 拦截工具(实时修改响应)
适用场景:需要实时拦截请求并动态修改响应(如测试异常场景)。 工具组合:Postman 代理 + Charles/Fiddler(抓包工具)或 Postman 拦截器(需配合浏览器扩展)。 步骤
  1. 设置 Postman 代理
    1. 打开 Postman → 右上角 Capture requests → 选择 Via Proxy
    2. 设置代理端口(如 5555),并启动代理。
  2. 配置系统代理
    1. 将测试系统的网络代理设置为你的电脑 IP 和端口(如 192.168.1.10:5555),确保流量经过 Postman。
  3. 使用抓包工具拦截请求(以 Charles 为例)
    1. 启动 Charles → 设置代理与 Postman 一致(端口 5555)。
    2. 在 Charles 中启用 Breakpoints(断点功能),针对目标 API 路径设置断点。
  4. 拦截并修改响应
    1. 当系统发送请求时,Charles 会暂停请求 → 右键选择 Edit Response → 修改响应体或状态码 → 点击 Execute 继续。
  5. 验证
    1. 系统会接收到你修改后的模拟数据。

方法三:Postman 拦截器 + 脚本(仅限浏览器)
适用场景:快速在浏览器中拦截并修改 API 响应(需安装 Postman 拦截器扩展)。 步骤
  1. 安装 Postman 拦截器
    1. 在 Chrome 或 Edge 中安装 Postman Interceptor 扩展。
  2. 同步 Cookie 和 Header
    1. 打开 Postman → 点击右上角拦截器图标 → 启用 Interceptor 并连接浏览器。
  3. 捕获和修改请求
    1. 在浏览器中触发 API 请求 → Postman 会捕获到该请求。
    2. 在 Postman 中编辑请求的 TestsPre-request Script,动态生成模拟数据并发送(需编写脚本)。

注意事项
  1. HTTPS 解密
    1. 若拦截 HTTPS 请求,需在抓包工具(如 Charles)中安装 SSL 证书(方法参考工具文档)。
  2. 环境隔离
    1. 确保仅在测试环境操作,避免影响生产环境。
  3. 动态数据模拟
    1. 在 Postman 中使用 pm.response.set()Faker.js 库生成动态模拟数据(需编写脚本)。

根据你的需求选择合适的方法:
  • 快速模拟固定数据 → 使用 Mock Server
  • 实时修改动态响应 → 使用 代理 + 抓包工具
  • 浏览器端调试 → 使用 Postman 拦截器
 
 posted on 2025-05-08 16:45  王又又0226  阅读(151)  评论(0)    收藏  举报