REST API 参考
NeoMind 后端用 Axum 提供 REST API。本文给出面向集成商的 API 总览:base URL、认证、统一响应格式、各业务域端点分组。完整交互式文档见 Swagger UI。
入口
| 项 | 值 |
|---|---|
| Base URL | http://<SERVER_IP>:9375/api |
| Swagger UI(交互式文档) | http://<SERVER_IP>:9375/api/docs |
| 默认端口 | 9375(可用 --port / PORT 环境变量改) |
所有端点路径以
/api开头。下文的端点列表都省略/api前缀。
认证
两种鉴权方式:
1. JWT(用户会话)
Web UI 默认走这套:
POST /api/auth/login { "username": "...", "password": "..." }
→ 返回 JWT
之后所有请求加 Header:
Authorization: Bearer <jwt>
2. API Key(编程访问)
适合脚本 / 第三方集成:
- 在 Settings → API Keys 生成一个 Key
- 请求时加 Header:
X-API-Key: <key>
API Key 不依赖用户会话,可设过期时间与权限范围。
公开端点(无需认证)
少数端点无需鉴权:
/api/health//health/status//health/live//health/ready/api/system/network-info/api/auth/status//auth/verify/api/auth/login//auth/register/api/setup/*(首次配置向导)/api/llm-backends/types(列出后端类型)/api/messages/channels/types/api/extensions(列出扩展)/api/capabilities//capabilities/:name/api/tools
统一响应格式
成功
{
"success": true,
"data": { /* 业务数据 */ },
"meta": { /* 可选:分页 / 计数 / 时间戳 */ }
}
CLI / 编程集成提醒:CLI 包一层 data,集成商从 data.data 取真实业务对象。
失 败
{
"success": false,
"error": {
"code": "DEVICE_NOT_FOUND",
"message": "Device with id 'xxx' not found"
}
}
HTTP 状态码遵循惯例:4xx 客户端错误、5xx 服务端错误。从 error.message 提取可读信息。
字段命名约定
重要陷阱:后端返回 snake_case(如
data_source),前端使用 camelCase(如dataSource)。前端所有 API 响应都经web/src/store/persistence/types.ts::fromDashboardDTO()转换。集成商自己解析 JSON 时,字段以后端原样 snake_case 为准。
主要端点分组
Auth(认证)
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /auth/login | 登录拿 JWT |
| POST | /auth/register | 注册(首个用户自动 admin) |
| GET | /auth/status | 当前认证状态 |
| GET | /auth/verify | 验证 JWT 是否有效 |
Devices(设备)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /devices | 列出设备 |
| POST | /devices | 创建设备(需 connection_config: {} 即使为空) |
| GET | /devices/:id | 设备详情(含 metrics + commands) |
| PUT | /devices/:id | 更新设备 |
| DELETE | /devices/:id | 删除设备 |
| GET | /devices/:id/history | 遥测历史(?metric=&time_range=) |
| POST | /devices/:id/control | 下发指令({"command": "...", "params": {...}}) |
| POST | /devices/:id/webhook | Webhook 推数据(无需认证) |
| GET | /devices/types | 列出设备类型 |
| POST | /devices/types | 创建设备类型 |
| GET | /devices/drafts | 待审批草稿(自动发现) |
| POST | /devices/drafts/:id/approve | 审批草稿 |
Dashboards(仪表板)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /dashboards | 列出仪表板 |
| POST | /dashboards | 创建仪表板 |
| GET | /dashboards/:id | 仪表板详情 |
| PUT | /dashboards/:id | 更新仪表板(含布局) |
| DELETE | /dashboards/:id | 删除仪表板 |
| POST | /dashboards/:id/share | 生成分享链接(带过期) |
| GET | /dashboards/shared/:token | 访问分享(无需认证) |
Rules(规则)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /rules | 列出规则 |
| POST | /rules | 创建规则 — JSON body(name / trigger / condition / actions) |
| GET | /rules/:id | 规则详情 |
| PUT | /rules/:id | 更新规则 |
| DELETE | /rules/:id | 删除规则 |
| POST | /rules/:id/test | 试跑规则(不实际触发动作) |
规则用 JSON 格式(不是 DSL 字符串)。POST body 示例:
{
"name": "高温告警",
"trigger": { "trigger_type": "data_change" },
"condition": { "condition_type": "comparison", "source": "device:sensor-01:temperature", "operator": "greater_than", "threshold": 30 },
"actions": [ { "type": "notify", "message": "温度过高" } ]
}
条件类型:comparison / range / logical。动作类型:notify / execute / trigger_agent。触发类型:data_change / schedule / manual。