跳到主内容

API 总览

API 参考

API 总览

EnerOS 提供四种 API 接口,满足不同场景的接入需求。所有 API 均通过 eneros-apieneros-graphql crate 暴露,并由 eneros-gateway 进行统一鉴权、限流与安全审计。无论选择哪种协议,底层共享同一套内核系统调用,因此数据一致性、约束校验、审计日志均得到保证。

API 类型对比

EnerOS 提供四种 API 接口,分别对应不同的接入场景与通信模型:

类型协议传输方向适用场景实时性浏览器原生自动重连典型用途
RESTHTTP/1.1 或 HTTP/2请求-响应CRUD 操作、配置管理、批量任务同步是(fetch)网络/Agent/设备管理
GraphQLHTTP/1.1 或 HTTP/2请求-响应灵活查询、按需取数、聚合分析同步是(fetch)跨资源聚合查询
WebSocketWS/WSS(基于 HTTP 升级)双向全双工实时事件推送、远程指令下发实时(毫秒级)是(WebSocket)需手动实现Agent 状态、控制指令
SSEHTTP/1.1 长连接服务端→客户端单向实时推送、轻量订阅实时(秒级)是(EventSource)告警看板、事件大屏

选型决策树

是否需要服务端主动推送?
├── 否 → 是否需要灵活字段选取或跨资源聚合?
│       ├── 是 → GraphQL
│       └── 否 → REST
└── 是 → 是否需要客户端向服务端发送指令?
        ├── 是(双向) → WebSocket
        └── 否(单向) → 是否运行在浏览器中?
                ├── 是 → SSE(自动重连)
                └── 否 → WebSocket(更高效)

并发与资源占用

维度RESTGraphQLWebSocketSSE
单连接内存~50 KB~50 KB~80 KB~30 KB
单连接 CPU(空闲)0%0%0.1%0%
单连接 CPU(活跃)0.5%0.5%1.0%0.3%
单租户最大连接不限不限2050
协议开销低(首包后)

基础信息

Base URL

EnerOS API 的根 URL 取决于部署模式:

部署模式Base URL说明
单机本地http://localhost:8080/api/v1开发与测试
单机生产https://api.example.com/api/v1单实例对外
多区域https://{region}.api.eneros.io/api/v1cn-east.api.eneros.io
内网网格http://eneros-api.nerve.svc:8080/api/v1Kubernetes 内部

各协议端点:

协议端点说明
RESThttp://<host>:8080/api/v1资源 CRUD
GraphQLhttp://<host>:8080/graphqlQuery / Mutation
GraphQL Subscriptionws://<host>:8080/graphql实时订阅
WebSocketws://<host>:8080/ws双向事件流
SSEhttp://<host>:8080/api/v1/events/stream单向推送

生产环境强制启用 HTTPS / WSS,由 eneros-trust 签发证书。

通用约定

项目取值
内容类型application/json; charset=utf-8
字符编码UTF-8
时间格式RFC 3339 / UTC(如 2026-07-06T08:30:00Z
时区所有时间戳默认 UTC,可查询时附带 ?tz=Asia/Shanghai 转换显示
数值精度浮点数采用 IEEE 754 double,电气量默认 6 位有效数字
ID 格式字符串,前缀标识类型(net_agent_dev_evt_
资源命名复数形式(/networks/agents/devices
字段命名后端 snake_case,REST 响应保留 snake_case,GraphQL 转为 camelCase

鉴权方式

EnerOS 支持三种鉴权方式,可单独或组合使用:

1. Bearer Token

最常用的鉴权方式。Token 由 eneros-trust 签发,包含租户、角色、过期时间与权限范围。Token 默认有效期 1 小时,可通过刷新机制续期。

Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
字段类型必填默认值说明
Authorizationstring固定前缀 Bearer + JWT
Token 格式JWT (RS256)Header.Payload.Signature
Token 有效期int (秒)3600可在 eneros.toml 中配置
刷新 Tokenstring有效期 30 天,仅可使用一次

2. mTLS 双向认证

生产环境推荐使用。客户端与网关互相验证 X.509 证书,由内部 CA 签发。mTLS 可与 Bearer Token 叠加使用,实现双重校验。

curl --cert client.crt --key client.key --cacert ca.crt \
  https://api.example.com/api/v1/networks
字段类型必填默认值说明
客户端证书X.509 PEMCN 必须为 agent-{id}service-{name}
客户端私钥RSA/EC PEM至少 2048 位
CA 证书X.509 PEMEnerOS 内部 CA
证书有效期int (天)365到期前 30 天告警

3. API Key(仅限服务间调用)

用于内部服务调用的长期凭证,不能用于面向终端用户的场景。API Key 绑定到特定服务账号,权限范围受限。

X-API-Key: sk-internal-xxxxxxxxxxxxxxxxxxxx

鉴权方式对比

方式安全等级适用场景过期管理双向身份验证
Bearer TokenWeb/App 终端、短期会话自动过期 + 刷新
mTLS服务间、Agent ↔ 网关证书轮换
API Key内部受信任服务手动轮换

通用请求头

Header类型必填默认值说明
Authorizationstring是*Bearer <token>,公开端点除外
Content-Typestringapplication/jsonPOST/PUT/PATCH 必填
Acceptstringapplication/json可指定 application/jsonapplication/graphql-response+json
X-Tenant-Idstring自动从 Token 解析显式指定租户,需有跨租户权限
X-Request-Idstring自动生成 UUID链路追踪 ID,将透传至审计日志
X-Trace-IdstringOpenTelemetry trace ID
User-Agentstringeneros-client/0.1客户端标识
Accept-Languagestringzh-CN错误消息语言

通用响应格式

成功响应

所有 REST 成功响应均为 JSON,顶层字段约定如下:

字段类型必填说明
dataobject/array业务数据本体
metaobject分页、版本等元信息
request_idstring请求追踪 ID
timestampstring响应生成时间(RFC 3339)

示例:

{
  "data": {
    "id": "net_8f3a2b",
    "name": "IEEE-14"
  },
  "meta": {
    "version": "v1",
    "deprecated": false
  },
  "request_id": "req_20260706_8f3a2b",
  "timestamp": "2026-07-06T08:30:00Z"
}

错误响应

错误响应统一格式:

字段类型必填说明
error.codestring大写下划线错误码
error.messagestring人类可读错误描述
error.detailsobject结构化补充信息
error.trace_idstring链路追踪 ID
error.doc_urlstring文档链接
request_idstring请求追踪 ID

示例:

{
  "error": {
    "code": "CONSTRAINT_VIOLATION",
    "message": "Branch 1-2 overload: 105% of limit",
    "details": {
      "branch_id": "1-2",
      "loading": 1.05,
      "limit": 1.0
    },
    "trace_id": "trace_abc123",
    "doc_url": "https://docs.openeneros.com/api-reference/rest#错误码"
  },
  "request_id": "req_20260706_8f3a2b"
}

错误码总表

EnerOS 错误码分为五类:客户端错误(4xx)、服务端错误(5xx)、网关错误、安全错误、业务错误。

客户端错误(4xx)

HTTP错误码含义处理建议
400INVALID_REQUEST请求参数错误、JSON 格式错误检查请求体与参数
400INVALID_FIELD字段值非法(如枚举不匹配)查看字段说明
401UNAUTHORIZED未认证或 token 失效重新获取 token
401TOKEN_EXPIREDToken 已过期刷新 token
403FORBIDDEN权限不足联系管理员调整角色
403TENANT_MISMATCH跨租户访问被拒检查 X-Tenant-Id
404NOT_FOUND资源不存在核对资源 ID
405METHOD_NOT_ALLOWEDHTTP 方法不支持检查端点定义
409CONFLICT资源状态冲突重读后重试
409CONSTRAINT_VIOLATION违反安全约束修正电气参数
413PAYLOAD_TOO_LARGE请求体超过 1MB减小批量大小
422VALIDATION_FAILED业务校验失败查看错误详情
429RATE_LIMITED触发限流Retry-After 重试

服务端错误(5xx)

HTTP错误码含义处理建议
500INTERNAL_ERROR内核未捕获错误联系运维,附 trace_id
501NOT_IMPLEMENTED端点尚未实现等待版本更新
502BAD_GATEWAY上游服务异常重试或检查依赖
503SERVICE_UNAVAILABLE服务过载或维护中退避后重试
504GATEWAY_TIMEOUT网关等待上游超时检查任务是否异步执行

安全错误

HTTP错误码含义处理建议
401CERT_INVALIDmTLS 证书无效检查证书链
401CERT_EXPIRED证书已过期轮换证书
403IP_BLOCKEDIP 被拉黑联系管理员解封
403AUDIT_REQUIRED操作需审计留痕添加审计上下文

业务错误

HTTP错误码含义处理建议
409POWERFLOW_DIVERGED潮流不收敛调整初值或方法
409NETWORK_LOCKED网络被锁定(计算中)等待或释放锁
422TOPOLOGY_INVALID拓扑不合法(孤岛/环网)修正拓扑
422PARAM_OUT_OF_RANGE电气参数越界检查上下限
422AGENT_BUSYAgent 处于忙状态排队或等待

版本管理

EnerOS API 采用 URL 路径版本 + 语义化版本双重策略:

版本状态发布时间废弃时间说明
v1稳定2026-01当前主版本
v2预览2026-09(计划)下一主版本

详细策略见 版本管理

限流策略

EnerOS 采用分层限流,详见 限流与配额

维度速率说明
全局(IP)600 req/min防恶意刷接口
租户5000 req/h公平调度
计算类端点30 req/min保护内核算力
时序写入1000 req/min高吞吐场景

所有限流响应都附带 X-RateLimit-* 响应头,便于客户端自适应降速。

SDK 列表

EnerOS 官方提供以下 SDK,封装鉴权、重试、序列化等通用逻辑:

语言包名版本维护状态仓库
Rusteneros-sdk0.47.0官方主线eneros/crates/eneros-sdk
Pythoneneros-sdk-python0.47.0官方同步eneros/sdks/python
JavaScript/TypeScript@eneros/sdk0.47.0官方同步eneros/sdks/js
Goeneros-sdk-go0.47.0社区贡献github.com/eneros/go-sdk
Javaeneros-sdk-java0.45.0社区贡献github.com/eneros/java-sdk

SDK 选型建议

// Rust SDK 示例
use eneros_sdk::ApiClient;

let client = ApiClient::builder()
    .endpoint("http://localhost:8080")
    .api_version("v1")
    .token("<bearer-token>")
    .build()?;

let networks = client.networks().list().await?;
# Python SDK 示例
from eneros_sdk import ApiClient

client = ApiClient(
    endpoint="http://localhost:8080",
    api_version="v1",
    token="<bearer-token>",
)
networks = client.networks.list()
// JavaScript SDK 示例
import { ApiClient } from '@eneros/sdk';

const client = new ApiClient({
  endpoint: 'http://localhost:8080',
  apiVersion: 'v1',
  token: '<bearer-token>',
});
const networks = await client.networks.list();

快速验证

使用 cURL 快速验证 API 可用性:

# 1. 健康检查(无需认证)
curl http://localhost:8080/api/v1/health

# 2. 获取 Token(开发环境)
curl -X POST http://localhost:8080/api/v1/auth/token \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"admin"}'

# 3. 获取网络列表
curl -H "Authorization: Bearer <token>" \
  http://localhost:8080/api/v1/networks

# 4. 创建 Agent
curl -X POST http://localhost:8080/api/v1/agents \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"type":"dispatch","config":{}}'

# 5. GraphQL 查询
curl -X POST http://localhost:8080/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <token>" \
  -d '{"query":"{ networks { id name } }"}'

# 6. SSE 订阅告警
curl -N -H "Authorization: Bearer <token>" \
  "http://localhost:8080/api/v1/events/stream?topics=alarm&severity=critical"

通用响应字段枚举

资源状态枚举

资源状态值说明
Networkdraft / ready / locked / archived草稿/就绪/锁定/归档
Agentidle / running / paused / error / stopped空闲/运行/暂停/错误/停止
Deviceonline / offline / maintenance / fault在线/离线/维护/故障
Taskqueued / running / completed / failed / cancelled排队/运行/完成/失败/取消
Alarmactive / acknowledged / cleared活跃/已确认/已清除

严重级别枚举

数值说明
info0信息
warn1警告
error2错误
critical3严重,需立即处置

相关文档