api-design.md 8.3 KB

API设计

输入要求

  1. 业务需求(必填):需要设计的业务场景和功能
  2. 数据模型(必填):核心实体和字段
  3. 接口类型(可选):RESTful或GraphQL,默认RESTful
  4. 已有接口(可选):如果已有部分接口需要兼容
  5. 特殊要求(可选):如"需要支持批量操作"、"需要Webhook回调"

执行流程

第一步:Spec场景检查

设计前检查是否有明确的spec:

  • 如有spec:提取spec中的Requirement和Scenario作为接口设计依据,确保每个Requirement对应至少一个端点,每个Scenario映射为接口的成功/错误响应
  • 如无spec:提示用户先使用 spec-driven-development 对齐需求,或基于业务需求生成轻量级spec

    ✓ Spec场景检查: [检测到/未检测到] 需求规格
    [如检测到,列出 Requirement → 端点 映射]
    

第二步:需求分析

  • 识别API的使用场景和用户
  • 确定API的功能边界
  • 明确输入输出数据模型

第三步:设计原则应用

  • 应用RESTful或GraphQL设计原则
  • 设计URL结构和HTTP方法
  • 定义请求/响应格式

第四步:详细设计

  • 设计每个端点的详细规范
  • 定义错误处理策略
  • 设计认证和授权机制
  • 如接口涉及长任务/批处理/导入导出/生成任务,必须采用 Init → Step → Poll AJAX 渐进式防卡死架构

第五步:API规范定义

## API Spec: [API名称]

### ADDED Requirements

#### Requirement: [端点名称]

The system SHALL provide an endpoint to [功能描述].

##### Scenario: 成功请求

- GIVEN [前置条件]
- WHEN 发送 `[METHOD] [路径]` 请求
- THEN 返回 [状态码] 和 [响应体]

##### Scenario: 错误处理

- GIVEN [错误前置条件]
- WHEN 发送 `[METHOD] [路径]` 请求
- THEN 返回 [错误状态码] 和 [错误响应体]

### Design

- **URL结构**: [结构说明]
- **认证方式**: [认证机制]
- **版本策略**: [版本管理]

### File Changes

- `[API定义文件]` (new/modified)

规范验证(必填)

API规范定义完成后,必须完成以下验证才能进入文档生成:

  • 契约一致性:每个 Requirement 至少有一个 Scenario 覆盖,Scenario 的 Given/When/Then 完整
  • 错误码完备:每个端点定义了成功和至少一类错误场景的错误码
  • 认证/授权:需要鉴权的端点标注了认证方式和所需权限
  • 分页/限流:列表端点定义了分页参数和限流策略
  • 幂等性:写操作标注了是否幂等,非幂等操作定义了重试策略
  • 命名规范:路径、字段、错误码遵循统一命名规范(如 snake_case / camelCase)
  • 长任务契约:耗时操作采用 Init-Step-Poll 模式,定义了任务ID、进度查询端点、取消端点和超时策略

如某项无法验证,必须在文档生成时标注"未验证项",不得跳过。

第六步:文档生成

  • 生成OpenAPI/Swagger规范
  • 编写使用示例
  • 提供SDK代码示例

第七步:记录到项目记忆

API 设计完成后,将关键决策和规范记录到项目记忆(参见 project-memory-management.md):

  • 记录 API 设计决策(如 RESTful vs GraphQL 选择理由)
  • 记录接口命名约定和版本策略
  • 记录认证/授权方案的选型依据

实战请求示例

示例一:分页查询接口

帮我设计一个订单列表 API。
资源:orders。
查询条件:page、page_size、status、keyword、created_start、created_end。
权限:只有后台运营可访问;普通用户不能访问。
要求:分页最大 100;错误响应要有 code/message;keyword 支持订单号和手机号。
验证:给出正常请求、非法 page_size、无权限访问的响应示例。

优先加载:api-design.md、mysql-database.md、test-generation.md。

示例二:长任务导出接口

帮我设计一个订单导出 API,数据量可能超过 10 万。
要求:不能单请求同步导出,必须 Init-Step-Poll;支持进度、失败原因、取消和重试。
权限:只有管理员可导出;导出文件 24 小时后过期。
前端:需要轮询字段和错误提示文案。
验证:给出 Init、Step、Poll、Cancel 的请求/响应示例。

优先加载:api-design.md、frontend-design.md、test-generation.md。

输出格式


## API设计文档

### 资源定义

| 资源 | 说明 | 核心字段 |
| -------- | ------ | ---------- |
| [资源名] | [说明] | [字段列表] |

### 接口列表

#### [接口名称]

**URL**:`[METHOD] /path`
**说明**:[功能说明]

**请求参数**:
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| [字段] | [类型] | [是/否] | [说明] |

**响应格式**:

```json
{
  "code": 0,
  "data": { ... },
  "message": "success"
}
```

**错误码**:
| 错误码 | 说明 |
|--------|------|
| [CODE] | [说明] |

### 通用规范

- **认证方式**:[Bearer Token / API Key / OAuth2]
- **版本控制**:[URL路径 / Header / 参数]
- **分页方式**:[页码分页 / 游标分页]
- **数据格式**:[snake_case / camelCase]

### 长任务接口规范(如适用)

| 端点 | 方法 | 说明 |
|------|------|------|
| `/tasks/{type}/init` | POST | 创建任务,返回 `task_id`、`total`、初始状态 `queued` |
| `/tasks/{task_id}/step` | POST | 执行一批处理,返回进度和 `has_more` |
| `/tasks/{task_id}/poll` | GET | 查询任务状态、进度、错误和结果 |
| `/tasks/{task_id}/cancel` | POST | 标记任务取消,返回 `status=cancelled`;正在执行的 Step 在下一批次检测取消标记后优雅退出 |

**Step 响应必须包含**:`task_id`, `status`, `processed`, `total`, `percent`, `has_more`, `message`, `errors`

质量标准

  • URL必须使用名词复数形式,不能用动词(如/users而非/getUsers)
  • HTTP方法必须符合语义(GET无副作用、POST创建、PUT幂等更新、DELETE删除)
  • 错误响应必须包含机器可读的错误码和人工可读的消息
  • 分页接口必须说明最大页大小和默认页大小
  • 敏感操作(删除、批量修改)必须要求二次确认或特殊权限
  • 不得设计返回超大列表的接口(必须分页或流式)
  • 长任务/批处理接口必须采用 Init → Step → Poll,不得设计为单请求同步阻塞执行
  • Step 接口必须幂等、可重试,并限制单批处理数量

失败回退机制

| 步骤 | 失败条件 | 回退目标 | 最大重试 | 不可恢复时升级路径 | | - | - | - | - | - | | 第一步:Spec场景检查 | 无spec且业务需求模糊 | 基于业务需求生成轻量级spec草案 | 1 | 标注"需求未对齐",建议先走 Spec驱动开发 | | 第二步:需求分析 | 业务场景涉及多个领域,边界不清 | 拆分为多个子API分别设计 | 2 | 输出需求拆分建议,由用户确认后继续 | | 第三步:设计原则应用 | RESTful与GraphQL均不完全契合 | 选择主风格+局部例外,标注例外原因 | 1 | 输出两套方案对比,由用户决策 | | 第四步:详细设计 | 认证/授权机制与现有系统冲突 | 降级到最简认证(Bearer Token),标注待对齐 | 2 | 输出认证方案选型矩阵,移交架构决策 | | 第五步:API规范定义 | 端点数量过多导致单次输出超限 | 按资源域分批输出,每批3-5个端点 | 0 | 建议拆分为多个API版本迭代设计 | | 第六步:文档生成 | OpenAPI规范生成失败 | 降级为Markdown表格文档,标注"未生成机器可读spec" | 2 | 输出手写文档模板,建议人工补全 | | 第七步:记录到项目记忆 | 项目记忆系统不可用 | 输出Decision Record到本地文件 | 1 | 标注"记忆未沉淀",提示用户手动保存 |

关联 reference

  • tech-selection(技术选型)— 设计前可用 tech-selection 确定API技术方案(REST/GraphQL/gRPC)
  • code-generation(代码生成)— 设计后可用 code-generation 生成API接口代码
  • test-generation(测试用例生成)— 设计后可用 test-generation 生成API测试
  • doc-generation(文档生成)— 设计后可用 doc-generation 生成API文档
  • project-memory-management(项目记忆管理)— 记录 API 设计决策、接口命名约定和版本策略