Pre-request Script无法访问上一个请求的响应数据,必须在前一个请求的Tests中用pm.globals.set()或pm.environment.set()提取并设置变量,再在后续请求中通过{{variable}}引用;跨请求传递优先使用环境变量以避免污染。

Pre-request Script 里不能直接用上一个请求的响应数据
Postman 的 Pre-request Script 是在当前请求发出前执行的,它**看不到上一个请求的响应内容**。很多新手会误以为把提取逻辑写在当前接口的 Pre-request 里就能拿到前序结果,结果变量始终是 undefined。真正能读取响应的地方只有 Tests —— 它在响应到达后立即运行。
所以「等前置请求完成」不是靠阻塞或等待机制,而是靠执行顺序保证:你必须把提取和设变量的逻辑放在前一个请求的 Tests 中,再在下一个请求的 URL / Headers / Body 里用 {{variable}} 引用。
- 错误做法:
Pre-request Script中调用pm.response.json()→ 报错或返回空 - 正确路径:请求 A 的
Tests→ 提取值 →pm.globals.set("token", value)→ 请求 B 的任意字段中写{{token}} - 如果两个请求在同一个集合里连续执行,Postman 会自动按顺序跑完 A 再跑 B,无需额外“等待”代码
需要跨请求链路传递时,优先用环境变量而非全局变量
全局变量(pm.globals.set())作用域是整个 Postman 实例,所有集合、所有环境都共享。一旦多个测试并行跑,或者你在调试不同项目,很容易出现变量污染 —— 比如登录 A 系统的 token 被 B 系统的请求覆盖了。
环境变量(pm.environment.set())绑定到具体环境(比如 dev、test),切换环境就自动隔离变量。实际协作中更可控。
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
- 设置环境变量:
pm.environment.set("auth_token", jsonData.token) - 引用方式一样:
{{auth_token}},但只在当前选中的环境生效 - 记得在请求右上角下拉菜单中选对环境,否则
{{auth_token}}会渲染为空字符串,且无报错提示 - 调试时可打开 Console(View → Show Postman Console),用
console.log(pm.environment.get("auth_token"))确认是否存进去了
复杂嵌套或非 JSON 响应时,别硬 parse
有些接口返回的是纯文本、HTML、XML 或带 BOM 的 JSON,直接 pm.response.json() 会抛 SyntaxError: Unexpected token。不要反复试错,先看响应原始内容(点击 Response 标签页右上角「Pretty / Raw / Preview」切到 Raw)。
- 如果是 HTML 或 XML:
pm.response.text()拿字符串,再用正则或 DOMParser 处理(不推荐,稳定性差) - 如果是带 BOM 的 JSON:先截掉前三个字节:
pm.response.text().slice(3),再JSON.parse() - 如果响应体为空但状态码是 200:检查接口是否用了重定向(302)或 body 被吞了,此时
responseBody变量已废弃,必须用pm.response.text() - 最稳妥的做法:加一层 try/catch,并在
Tests里加断言,比如pm.test("Response has token", () => { pm.expect(jsonData).to.have.property("token"); });
想在 Pre-request 里发请求拿数据?用 pm.sendRequest 但要小心副作用
真有场景需要「当前请求前先调一个接口」(比如动态获取 CSRF token),就得在 Pre-request Script 里主动发请求。这时必须用 pm.sendRequest(),它是异步的,但 Postman 会自动等待它完成才发主请求。
注意它不走代理、不继承当前请求的 Auth/Headers(除非手动传),且失败时不会中断主请求 —— 你得自己判断 err 并处理。
- 基础用法:
pm.sendRequest("https://api.example.com/csrf", (err, res) => { if (!err) pm.environment.set("csrf", res.json().token); }); - 必须写回调函数,不能用
async/await(Postman Sandbox 不支持顶层 await) - 如果依赖多个前置请求,
pm.sendRequest之间没有自动串行,需嵌套或用 Promise.all + 自定义封装(超出轻量测试范畴,建议拆成独立请求链) - 调试时 Console 里看到
sendRequest日志比主请求日志早,说明它确实先执行了
实际跑通一条关联链,最关键的不是语法多漂亮,而是确认三点:前一个 Tests 里 set 成功了没、环境/全局变量名拼写是否完全一致、下一个请求是否真的在发送前就读到了那个变量 —— 这三处任一出错,{{xxx}} 就静默失效,连 warning 都不给。










