前言:本文接前面Apifox 测试项目的案例。
1.环境变量设置:

2.起步

编辑后续动作:

javascript
// 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.heartbeat:
heartbeat 在 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(和别的接口一致)
在 环境管理 → 开发环境 增加或复用变量,例如:
| 变量名 | 值从哪来 |
|---|---|
deviceToken |
POST /api/v1/device/handshake 响应里的 data.deviceToken |
bearerToken |
与 deviceToken 填同一个值(或后置脚本自动同步) |
Header 填:
Authorization: Bearer {{deviceToken}}
或在 Auth 里选 Bearer Token,Token 填:{``{deviceToken}}。
注意:
- 不要用
adminToken(用户登录 token)去测设备activities/templates;那些接口要 deviceToken。 - heartbeat 即使用错 token 也不影响,因为服务端不校验。
3. Apifox 操作步骤(完整链路)
步骤 1:先有设备(拿到 deviceId)
任选一种:
商家端(需 merchantToken):
POST {``{baseUrl}}/api/v1/merchant/devices
{
"merchantId": 1,
"deviceCode": "DV_TEST_001",
"secret": "test-secret-123",
"name": "Apifox测试机"
}
记下返回的 data.id → 写入环境变量 deviceId。
或 先 handshake(若库里已有设备)见步骤 2。
步骤 2:handshake(建议做,顺便拿 token)
POST {``{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)
| 接口 | 要不要 Bearer | Token 类型 |
|---|---|---|
POST /device/handshake |
不要 | --- |
POST /device/heartbeat |
不要(后端不校验) | --- |
GET /device/{deviceId}/activities |
要 | deviceToken(handshake 返回) |
GET .../templates |
要 | 同上 |
POST /auth/login |
不要 | 返回 adminToken / merchantToken |
所以:heartbeat 重点填 Body 里的 deviceId;bearerToken 主要是给 activities/templates 用的,可先 handshake 写入 deviceToken。
5. 调试页检查清单
- URL 是否为:
http://127.0.0.1:8089/api/v1/device/heartbeat(前置 URL + 路径不要重复 host) - Body 是否为 application/json
deviceId是否为库里真实 ID- 两次 heartbeat 间隔是否 大于 3 秒
按上面做完,heartbeat 应返回 "data": { "status": "OK" }。

5.保存测试用例:
