跳到主要内容

API 概览

本文档描述 EasyNetBak 的版本化公共 API。它与页面内部使用的 /api/ 接口不是同一套接口;对外集成请只使用 /api/v1/

基础地址与版本

<server> 替换为 EasyNetBak 的访问地址:

https://<server>/api/v1

当前公共 API 共覆盖设备、分组、凭据、备份模板、备份记录和系统统计。

认证

所有 /api/v1/ 请求都必须携带 X-API-Key

X-API-Key: nb_your_api_key

API Key 在 Web 管理界面的 API Key 页面创建,需要 api_keys.create 权限。完整明文 Key 只在创建完成时显示一次;服务端只保存哈希值。API Key 失效、过期或被删除后不能继续使用。

API Key 绑定到创建它的用户,API 请求仍会使用该用户的角色和权限进行校验。API Key 不会绕过权限检查,也不会回退使用浏览器 Session Cookie。

示例:

curl "http://localhost:8000/api/v1/stats" \
-H "X-API-Key: nb_your_api_key"

不要把 Key 放在 URL 查询参数中,也不要写入 Git、普通业务日志或监控标签。

当前端点

资源方法路径所需权限
设备GET/devicesdevices.view
设备GET/devices/unreachabledevices.view
设备GET/devices/{device_id}devices.view
设备POST/devicesdevices.create
设备PUT/devices/{device_id}devices.update
设备DELETE/devices/{device_id}devices.delete
设备备份历史GET/devices/{device_id}/backupsbackups.view
分组GET/groupsgroups.view
分组GET/groups/treegroups.view
分组GET/groups/{group_id}groups.view
分组POST/groupsgroups.create
分组PUT/groups/{group_id}groups.update
分组DELETE/groups/{group_id}groups.delete
凭据GET/credentialscredentials.view
凭据GET/credentials/{credential_id}credentials.view
凭据POST/credentialscredentials.create
凭据PUT/credentials/{credential_id}credentials.update
凭据DELETE/credentials/{credential_id}credentials.delete
备份模板GET/templatestemplates.view
备份模板GET/templates/{template_id}templates.view
备份模板POST/templatestemplates.create
备份模板PUT/templates/{template_id}templates.update
备份模板DELETE/templates/{template_id}templates.delete
备份内容GET/backups/{backup_id}/contentbackups.view
系统统计GET/statsdashboard.view

管理员角色默认拥有全部权限。具体请求字段和响应模型见左侧各资源页面。

数据范围与权限边界

  • 设备列表、不可达设备、设备详情、更新、删除以及设备备份历史会按用户的设备组范围过滤或校验。
  • 读取备份内容也会校验备份所属设备是否在用户可见设备组内。
  • 当前 POST /devices 实现只检查 devices.create,创建时的 group_id 不额外执行设备组范围校验。
  • 分组、凭据、备份模板和系统统计接口当前按权限校验;这些公共 API 路由本身不额外应用设备组过滤。

分页

列表接口使用 pagelimit

GET /api/v1/devices?page=1&limit=50

普通列表默认 page=1limit=50limit 范围为 1-100。设备备份历史默认 limit=10,范围为 1-200。页码从 1 开始。

分页响应统一包含:

{
"items": [],
"pagination": {
"page": 1,
"limit": 50,
"total": 0,
"total_pages": 1,
"has_next": false,
"has_prev": false
}
}

当没有数据时,total0total_pages 仍为 1

成功响应

  • GET200 OK
  • POST201 Created
  • PUT200 OK
  • DELETE200 OK,正文通常为 { "status": "success" }

错误响应

API 错误统一使用以下结构:

{
"error": {
"code": "PERMISSION_DENIED",
"message": "Permission denied",
"request_id": "request-id-from-response-header",
"details": {}
}
}

常见状态码:

状态码常见 code含义
400业务错误码请求内容不满足业务规则
401UNAUTHORIZED缺少、无效、过期或已失效的 API Key
403PERMISSION_DENIED用户缺少接口所需权限,或资源超出设备组范围
404RESOURCE_NOT_FOUND 或资源专用错误码资源不存在
409CONFLICT 或资源专用错误码当前资源状态不允许操作
422VALIDATION_ERROR查询参数或 JSON 请求体校验失败
500INTERNAL_ERROR服务端内部错误

校验失败时,详细字段错误位于 error.details.errors。业务错误的 code 可能是 DEVICE_NAME_EXISTSRESOURCE_CREDENTIAL_IN_USE 等资源专用代码,具体见对应页面。

每个响应都会带有 X-Request-ID,错误正文中的 error.request_id 与该响应头一致。排查问题时请保留这个 ID。

OpenAPI 与交互式文档

运行 EasyNetBak 后,可以访问:

Swagger UI 用于确认当前运行版本实际生成的参数、响应模型和错误响应;本页的手工说明用于解释接口约定和使用边界。