Postman中提取JSON字段首选pm.response.json(),需先校验状态码再解析,取值时用可选链或存在性判断;变量优先用环境变量,引用时注意位置和语法,调试需通过环境变量面板确认设置是否生效。

Postman里提取响应 JSON 字段最常用的方法是 pm.response.json()
几乎所有需要关联的接口,返回都是 JSON 格式。直接用 pm.response.json() 解析比手动 JSON.parse(responseBody) 更安全——它自动处理空响应、非 JSON 响应、编码异常等情况,不会让脚本因解析失败而静默中断。
常见错误现象:TypeError: Cannot read property 'xxx' of undefined,往往是因为没做字段存在性判断就直接取值。比如返回结构可能是 {"code":0,"data":null},但脚本写了 jsonData.data.token 就会崩。
实操建议:
- 始终先校验响应状态码,再解析:
if (pm.response.code === 200) { const jsonData = pm.response.json(); ... } - 取嵌套字段时用可选链(Postman v9.15+ 支持):
jsonData?.data?.access_token - 老版本或需兼容时,用
jsonData && jsonData.data && jsonData.data.access_token或_.get(jsonData, 'data.access_token')(需提前引入 Lodash)
环境变量 vs 全局变量:优先用 pm.environment.set()
除非你明确需要跨环境共享(比如所有测试环境都共用一个 mock token),否则一律用环境变量。全局变量在团队协作中极易被意外覆盖——A 同事跑完登录接口设了 pm.globals.set("token", "xxx"),B 同事同时跑另一个流程设了同名变量,结果互相污染。
使用场景差异:
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
-
pm.environment.set("user_id", jsonData.data.id):适合单次测试流,比如「登录 → 获取用户信息 → 修改资料」这一串请求共用一套变量 -
pm.globals.set("api_base_url", "https://staging.example.com"):适合写死的配置项,不随请求动态变化 -
pm.collectionVariables.set("order_no", ...):适合集合内多个请求共享、但不想暴露到环境快照里的临时值(比如生成的随机订单号)
注意:pm.environment.set() 设置后,变量只在当前选中的环境里生效;如果右上角没选对环境,{{user_id}} 会显示为字面量,不替换。
在下个接口里正确引用变量,关键看位置和语法
变量不是随处都能用的。{{user_id}} 只能在以下位置生效:
- URL 的 path 或 query 参数中(如
/users/{{user_id}}或?id={{user_id}}) - Headers 的 value 里(如
Authorization: Bearer {{token}}) - Body 的 raw(JSON)、x-www-form-urlencoded、form-data 中(注意:JSON body 必须用双引号包裹,
"id": "{{user_id}}",不能写成"id": {{user_id}},否则 JSON 格式非法)
容易踩的坑:
- 在 Pre-request Script 里试图用
{{user_id}}—— 这是字符串模板语法,脚本里必须用pm.environment.get("user_id") - 变量名含特殊字符(如
access-token)导致引用失败,改用下划线access_token - 环境变量初始值为空,但接口参数又没设默认值,导致请求发出去带的是
/users/(空字符串),而不是报错提醒
调试时怎么看变量有没有真正设进去
别只信 Tests 脚本里那行 pm.environment.set()。最可靠的方式是点右上角眼睛图标(View environment variables),看对应 key 的 value 是否已更新。如果还是空,说明:
- 脚本根本没执行(比如上个请求失败了,Tests 不会运行)
- JSON 解析出错,后续代码跳过(加
console.log("raw response:", responseBody)确认原始响应) - 字段路径写错,比如实际是
jsonData.result.userId,你写了jsonData.data.user_id - 环境没选对,或者变量名大小写不一致(
UserId≠userid)
复杂点在于:Postman 的变量作用域是异步生效的。比如你在 A 接口 Tests 里设了 pm.environment.set("x", "1"),立刻在 B 接口 Pre-request Script 里调 pm.environment.get("x") 是能拿到的;但如果你在 B 的 Tests 里再设一次同名变量,A 接口的值不会被覆盖——因为每个请求的 Tests 是独立执行的。这点容易被忽略。

















