- Create SECURITY.md with vulnerability disclosure policy - Create docs/README.md as documentation index page - Create docs/observability.md with metrics/logs/traces/alerting/SLO specs - Create docs/runbook.md with troubleshooting scenarios (RB-01 to RB-05) - Create docs/security.md with security design and compliance - Create docs/release.md with versioning and rollback strategies - Create docs/database.md with database design and migration strategy - Create docs/adr/0005-cache-error-handler.md for cache error handling ADR - Update README.md with documentation index section - Update docs/architecture.md to update B-7 rule and add trust boundary section - Create docs/api-guide.md with API specifications - Fix method names in OrderDao.java to match OrderMapper interface - Add Spring Boot Actuator dependency to tmpl-infrastructure - Fix Redis ping method in RedisHealthContributor.java - Fix syntax errors and method names in OrderAppService.java Co-authored-by: Qwen-Coder <[email protected]>
5.0 KiB
5.0 KiB
API 指南 (API Guide)
本文档定义 tmpl-api 服务的 REST API 规范,包括端点、请求/响应格式、错误码、认证授权等。
1. API 端点规范
1.1 命名约定
| 资源 | 列表 | 详情 | 创建 | 更新 | 删除 |
|---|---|---|---|---|---|
| 订单 | GET /api/v1/orders |
GET /api/v1/orders/{id} |
POST /api/v1/orders |
PATCH /api/v1/orders/{id}/status |
DELETE /api/v1/orders/{id} |
1.2 版本控制
API 版本通过 URL 路径控制:/api/v{version}/{resource}。当前版本为 v1。
1.3 HTTP 方法语义
GET:安全、幂等,用于查询资源POST:非幂等,用于创建资源或触发操作PUT:幂等,用于完全替换资源(当前未使用,使用 PATCH)PATCH:幂等,用于部分更新资源DELETE:幂等,用于删除资源
2. 请求格式
2.1 内容类型
| 方法 | Content-Type | Accept |
|---|---|---|
| GET | (无) | application/json |
| POST | application/json;charset=UTF-8 |
application/json |
| PATCH | application/json;charset=UTF-8 |
application/json |
| DELETE | (无) | application/json |
2.2 多租户 Header(必需)
所有请求必须携带以下 Header:
| Header | 类型 | 说明 |
|---|---|---|
X-Tenant-Id |
String | 租户标识,长度 ≤ 64 字符 |
X-Dept-Id |
String | 部门标识,长度 ≤ 64 字符,"0" 表示跨部门 |
X-User-Id |
Long | 操作人 ID,必须为合法数字 |
重要:这些 Header 由 API Gateway 从 JWT Token 中提取并注入,服务不信任客户端直接传入的值。
3. 响应格式
3.1 成功响应
{
"code": 200,
"message": "Success",
"data": {
// 具体业务数据
},
"timestamp": "2026-02-12T10:00:00.123Z",
"traceId": "abc123def456"
}
3.2 分页响应
{
"code": 200,
"message": "Success",
"data": {
"items": [...],
"total": 100,
"pageNum": 1,
"pageSize": 20,
"pages": 5
},
"timestamp": "2026-02-12T10:00:00.123Z",
"traceId": "abc123def456"
}
3.3 创建响应
{
"code": 201,
"message": "Created",
"data": {
// 新创建的资源数据
},
"timestamp": "2026-02-12T10:00:00.123Z",
"traceId": "abc123def456"
}
3.4 空响应
DELETE 操作成功时返回 204 No Content,无响应体。
4. 错误响应
4.1 标准错误格式
{
"code": 400,
"errorCode": "COMMON_INVALID_PARAM",
"message": "参数校验失败",
"details": "orderNo 不能为空", // 仅非生产环境返回
"timestamp": "2026-02-12T10:00:00.123Z",
"traceId": "abc123def456"
}
4.2 通用错误码
| HTTP 状态码 | errorCode | message | 说明 |
|---|---|---|---|
| 400 | COMMON_INVALID_PARAM |
参数校验失败 | 请求参数不符合约束 |
| 400 | AUTH_MISSING_TENANT |
缺少租户标识 | 缺少 X-Tenant-Id Header |
| 400 | AUTH_MISSING_DEPT |
缺少部门标识 | 缺少 X-Dept-Id Header |
| 400 | AUTH_INVALID_USER_ID |
用户标识格式不合法 | X-User-Id 非合法数字 |
| 400 | AUTH_HEADER_CONFLICT |
请求头信息冲突 | 新旧 Header 值不一致 |
| 403 | AUTH_ACCESS_DENIED |
无权限 | 认证失败或权限不足 |
| 403 | AUTH_FORBIDDEN_SCOPE |
部门范围越权 | deptId=0 但无 SCOPE_ALL_DEPT 权限 |
| 404 | COMMON_NOT_FOUND |
资源不存在 | 请求的资源不存在 |
| 409 | COMMON_OPTIMISTIC_LOCK |
数据已被修改,请刷新重试 | 乐观锁冲突 |
| 422 | ORDER_AMOUNT_INVALID |
订单金额不合法 | 订单金额相关业务校验失败 |
| 500 | COMMON_INTERNAL_ERROR |
系统内部错误 | 服务器内部错误 |
5. 认证
当前状态
模板当前未启用认证(SecurityConfig 配置为 permitAll()),适用于开发和演示环境。
生产要求
在生产部署中,所有 /api/** 请求必须经过认证。推荐方案为 JWT Bearer Token
(spring-boot-starter-oauth2-resource-server)。
X-Tenant-Id Header
所有 API 请求必须携带 X-Tenant-Id Header。
重要:在生产环境中,此 Header 的值必须由 API Gateway / 认证层从已验证的 JWT Token 中提取并注入,不得信任客户端直接传入的值。tmpl-api 假设上游已完成校验。
缺失该 Header 时,服务返回 400 Bad Request:
{
"code": 400,
"message": "Missing X-Tenant-Id header",
"data": null
}
6. 限流与熔断
当前未实现限流与熔断机制,计划在后续迭代中引入 Resilience4j。
7. 监控指标
API 调用通过 Micrometer 自动记录以下指标:
http.server.requests:请求计数、延迟、状态码分布http.client.requests:下游服务调用指标(如有)- 业务自定义指标(如
order.created.total)
8. 安全考虑
- 输入参数必须经过校验,防止注入攻击
- 敏感信息不在日志中记录
- 所有查询自动附加租户隔离条件
- 响应中不泄露系统内部信息