前言本文接前面Apifox 测试项目的案例。1.环境变量设置2.起步编辑后续动作// 1. 解析接口返回的 JSON const res pm.response.json(); // 2. 从返回结果里取出 token对应你给的返回格式 const token res.data.token; // 3. 把 token 写入当前选中的「开发环境」变量 adminToken 中 pm.environment.set(adminToken, token); // 4. 控制台打印方便你确认是否成功 console.log(✅ 登录成功adminToken 已自动写入环境变量, token);说明上图中pm是 Apifox和 Postman 等同类工具里默认提供的全局对象不用你自己定义也不用额外引入是脚本环境自带的「内置变量」。一、pm到底是什么简单说它是Postman/Apifox 的脚本运行环境里预定义好的「工具包」里面打包了所有和「请求、响应、环境变量、断言」相关的功能只要你在「前置操作 / 后置操作」的脚本里写代码就能直接用pm不用自己写任何前置代码二、现在用到的pm功能拆解拿你登录接口的脚本来说// 1. pm.response拿到当前接口的响应数据 const res pm.response.json(); // 2. pm.environment操作当前选中的环境变量 pm.environment.set(adminToken, token); // 3. pm.console在底部控制台打印日志其实 console 也是全局的pm.console 是别名 console.log(token 已写入, token);三、为什么它是默认就有的这是工具的「内置运行环境」设计你写的脚本不是直接跑在浏览器或 Node.js 里而是跑在 Apifox 自己封装的沙箱环境里工具在沙箱启动时会自动把pm这个全局对象注入进去你不用npm install也不用require()直接写就能用四、pm里你以后可能会用到的常用功能功能用途示例pm.response.json()把接口返回的 JSON 转成 JS 对象const data pm.response.json();pm.environment.set(key, value)给当前环境变量赋值pm.environment.set(merchantId, data.data.merchantId);pm.environment.get(key)读取当前环境变量的值const token pm.environment.get(adminToken);pm.test(描述, function() {...})写接口断言比如校验状态码pm.test(状态码是200, () pm.response.to.have.status(200));补充和 Postman 的关系Apifox 为了兼容用户的使用习惯直接兼容了 Postman 的pm对象语法。所以你在网上搜的 Postman 脚本大部分都可以直接复制到 Apifox 里用不用改。3.heartbeatheartbeat在 Apifox 里可以按下面方式测。先说结论这个接口后端不校验Authorization文档里的Bearer {{bearerToken}}是 OpenAPI 全局安全配置带出来的可以不填也能调通。1. 服务端实际要什么POST /api/v1/device/heartbeat只读 Body不读 Header 里的 token字段必填说明deviceId是设备 ID数字version否客户端版本会写入库status否文档有当前代码基本未用成功示例{success: true,message: Success,data: { status: OK }}常见失败deviceId is required— 没传deviceIdDevice not found— 库里没有该设备Device is not active— 设备状态不是 ACTIVEHeartbeat too frequent— 3 秒内重复请求限流2.Authorization: Bearer {{bearerToken}}怎么填情况 A只测 heartbeat推荐先这样Header 可以不填或在 Apifox Auth → 无认证 / 不继承父级只保证 Body 里有正确的deviceId{{bearerToken}}来自导入时 OpenAPI 的全局 JWT 说明不是 heartbeat 专用要求。情况 B想统一用 Bearer和别的接口一致在 环境管理 → 开发环境 增加或复用变量例如变量名值从哪来deviceTokenPOST /api/v1/device/handshake响应里的data.deviceTokenbearerToken与deviceToken填同一个值或后置脚本自动同步Header 填Authorization: Bearer {{deviceToken}}或在 Auth 里选 Bearer TokenToken 填{{deviceToken}}。注意不要用adminToken用户登录 token去测设备activities/templates那些接口要 deviceToken。heartbeat 即使用错 token 也不影响因为服务端不校验。3. Apifox 操作步骤完整链路步骤 1先有设备拿到deviceId任选一种商家端需merchantTokenPOST {{baseUrl}}/api/v1/merchant/devices{merchantId: 1,deviceCode: DV_TEST_001,secret: test-secret-123,name: Apifox测试机}记下返回的data.id→ 写入环境变量deviceId。或 先handshake若库里已有设备见步骤 2。步骤 2handshake建议做顺便拿 tokenPOST {{baseUrl}}/api/v1/device/handshake无需 Authorization{deviceCode: DV_TEST_001,secret: test-secret-123}成功响应示例{success: true,data: {deviceId: 1,deviceToken: eyJhbGciOiJIUzI1NiJ9...,expiresIn: 86400,serverTime: ...}}后置脚本开发环境const res pm.response.json();if (res.success res.data) {pm.environment.set(deviceId, String(res.data.deviceId));pm.environment.set(deviceToken, res.data.deviceToken);pm.environment.set(bearerToken, res.data.deviceToken); // 与文档占位符对齐}步骤 3测 heartbeat左侧 device-controller → POST heartbeat点 调试不要只看文档页右上角环境选 开发环境Auth无认证或 Bearer{{deviceToken}}可有可无Body → JSON{deviceId: {{deviceId}},version: 1.0.0}若环境变量是数字类型也可直接写deviceId: 1。点 发送4. 和后续接口的区别避免混用 token接口要不要 BearerToken 类型POST /device/handshake不要—POST /device/heartbeat不要后端不校验—GET /device/{deviceId}/activities要deviceTokenhandshake 返回GET .../templates要同上POST /auth/login不要返回adminToken/merchantToken所以heartbeat 重点填 Body 里的deviceIdbearerToken主要是给 activities/templates 用的可先 handshake 写入deviceToken。5. 调试页检查清单URL 是否为http://127.0.0.1:8089/api/v1/device/heartbeat前置 URL 路径不要重复 hostBody 是否为 application/jsondeviceId是否为库里真实 ID两次 heartbeat 间隔是否 大于 3 秒按上面做完heartbeat 应返回data: { status: OK }。5.保存测试用例