IoT 业务中心 RESTful API 指南
本指南定义了移动应用客户端(Android / iOS)及管理控制台(Web)与设备业务中心交互的 RESTful API 规范。所有接口均要求通过 HTTPS 协议进行安全通信。
1. 架构拓扑与交互流向
当客户端请求设备业务中心的 RESTful 接口时,由 API 网关统一处理身份校验(JWT)、流量限制(X-RateLimit)和请求路由。
mermaid
sequenceDiagram
participant Client as 客户端 (Web / App)
participant Gateway as API 网关
participant Auth as 身份鉴权中心 (Auth)
participant Core as 业务后台 (Core)
Client->>Gateway: 发起 API 请求 (携带 Bearer Token)
Gateway->>Auth: 验证 Access Token
alt Token 验证成功
Auth-->>Gateway: 校验通过 (包含 User & Scope 元数据)
Gateway->>Gateway: 限流检测 (X-RateLimit)
alt 频次未超限
Gateway->>Core: 路由转发请求
Core-->>Gateway: 返回业务响应数据 (JSON)
Gateway-->>Client: 200 OK (携带 X-RateLimit-* 头)
else 频次超限 (Rate Limit Exceeded)
Gateway-->>Client: 429 Too Many Requests (携带 RFC 7807 结构)
end
else Token 失效/过期
Auth-->>Gateway: 验证失败 (Expired / Invalid)
Gateway-->>Client: 401 Unauthorized (提示刷新 Token)
end2. 基础信息
2.1 根路径 (Base URL)
生产环境 API 服务的统一入口为:
http
https://api.example.com/v1注意:所有请求必须使用 HTTPS 强加密协议,任何 HTTP 请求都将被 301 重定向至 HTTPS。
2.2 字符编码与格式
- 通信格式: 统一采用
application/json。 - 字符集:
UTF-8。 - 时间戳格式: 采用 Unix 时间戳格式(单位:毫秒,如
1716000000000)。
3. 安全与身份验证 (JWT)
系统使用 JSON Web Token (JWT) 作为请求凭证。客户端在登录成功后将获得一组 Token。
3.1 令牌机制
- Access Token: 访问令牌,用于访问所有受保护资源。
- 有效期: 2 小时。
- 请求携带方式: 在 HTTP 头部注入
Authorization。httpAuthorization: Bearer <access_token>
- Refresh Token: 刷新令牌,用于当 Access Token 过期时换取新令牌。
- 有效期: 7 天。
- 更新方式: 客户端通过调用
POST /v1/auth/refresh接口换取,无需用户重新输入密码。
4. 并发限制 (Rate Limiting)
为了防御恶意攻击并防止接口被大流量压垮,网关针对客户端凭证(Token)及 IP 地址实施严格的限流。
4.1 限流响应头 (Rate Limit Headers)
网关会在每个 API 请求的响应中携带以下头部,以便客户端根据频次自调整:
| 响应头 | 数据类型 | 描述 |
|---|---|---|
X-RateLimit-Limit | Integer | 当前接口允许的最大请求频率(单位:次/分钟) |
X-RateLimit-Remaining | Integer | 当前时间窗口内剩余可用的请求次数 |
X-RateLimit-Reset | Integer | 限制重置的 Unix 时间戳(单位:秒) |
4.2 触发限流
当请求超过频次上限时,API 将直接拒绝连接,返回 429 Too Many Requests 状态码,并在响应头中包含:
http
Retry-After: 35提示:Retry-After 指明客户端需要等待的秒数(如 35 秒)方可发起下一次请求。
5. 统一异常规范 (RFC 7807)
为了提供更细致的故障排查信息,我们遵循 RFC 7807 (Problem Details for HTTP APIs) 规范。对于所有 4xx / 5xx 错误响应,Content-Type 统一设为 application/problem+json,响应体包含以下结构:
json
{
"type": "https://api.example.com/errors/rate-limit-exceeded",
"title": "Too Many Requests",
"status": 429,
"detail": "Your current request rate exceeds the allocated limit of 100 requests per minute.",
"instance": "/v1/devices"
}5.1 字段描述
type(string): 错误类型的唯一 URI 地址,指向关于此错误的开发者文档。title(string): 简短且易懂的错误说明(通常与 HTTP 状态码短语一致)。status(integer): 此次错误的 HTTP 状态码。detail(string): 具体的故障排查提示,解释为什么出错以及如何纠正。instance(string): 发生此次错误的 API 请求路径。