Files
Bruno GaoandQwen-Coder 2fd1eb59ab docs: Complete production-grade documentation set
- 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]>
2026-02-12 21:47:33 +08:00

192 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 成功响应
```json
{
"code": 200,
"message": "Success",
"data": {
// 具体业务数据
},
"timestamp": "2026-02-12T10:00:00.123Z",
"traceId": "abc123def456"
}
```
### 3.2 分页响应
```json
{
"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 创建响应
```json
{
"code": 201,
"message": "Created",
"data": {
// 新创建的资源数据
},
"timestamp": "2026-02-12T10:00:00.123Z",
"traceId": "abc123def456"
}
```
### 3.4 空响应
DELETE 操作成功时返回 204 No Content,无响应体。
---
## 4. 错误响应
### 4.1 标准错误格式
```json
{
"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`:
```json
{
"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. 安全考虑
- 输入参数必须经过校验,防止注入攻击
- 敏感信息不在日志中记录
- 所有查询自动附加租户隔离条件
- 响应中不泄露系统内部信息