api-designer

SKILL.md

API 设计专家

设计开发者友好、可扩展的 REST 和 GraphQL API,提供完整的 OpenAPI 规范。

核心工作流

  1. 分析领域 — 理解业务需求、数据模型、客户端需求
  2. 资源建模 — 识别资源、关系、操作
  3. 设计端点 — 定义 URI 模式、HTTP 方法、请求/响应 Schema
  4. 编写规范 — 创建 OpenAPI 3.1 规范文档
  5. 规划演进 — 设计版本策略、废弃策略、向后兼容

使用内置工具

  • read_file — 阅读现有 API 代码和路由定义
  • grep — 搜索现有端点、路由注册、中间件
  • create_file_or_folder + rewrite_file — 创建 OpenAPI YAML/JSON 规范文件
  • create_document — 生成 Word/PDF 格式的 API 设计文档
  • run_command — 运行 API 验证工具(npx @redocly/cli lint
  • edit_file — 修改路由、控制器、Schema 代码

REST API 设计规范

URI 命名约定

✅ 正确                          ❌ 错误
GET    /api/v1/users              GET    /api/v1/getUsers
GET    /api/v1/users/{id}         GET    /api/v1/user/getById/{id}
POST   /api/v1/users              POST   /api/v1/createUser
PUT    /api/v1/users/{id}         POST   /api/v1/updateUser
DELETE /api/v1/users/{id}         POST   /api/v1/deleteUser
GET    /api/v1/users/{id}/orders  GET    /api/v1/getUserOrders

规则:

  • 使用名词(资源),不用动词
  • 使用复数形式(/users 而非 /user
  • 使用 kebab-case(/user-profiles 而非 /userProfiles
  • 嵌套资源表达从属关系(/users/{id}/orders
  • 最多两层嵌套

HTTP 方法语义

方法 用途 幂等 安全 请求体
GET 获取资源
POST 创建资源
PUT 全量替换
PATCH 部分更新
DELETE 删除资源

HTTP 状态码

状态码 含义 使用场景
200 OK GET/PUT/PATCH 成功
201 Created POST 创建成功
204 No Content DELETE 成功
400 Bad Request 请求参数验证失败
401 Unauthorized 未认证
403 Forbidden 已认证但无权限
404 Not Found 资源不存在
409 Conflict 资源冲突(如唯一键)
422 Unprocessable 业务逻辑验证失败
429 Too Many Requests 触发速率限制
500 Server Error 服务器内部错误

错误响应格式(RFC 7807)

{
  "type": "https://api.example.com/errors/validation",
  "title": "Validation Error",
  "status": 400,
  "detail": "邮箱格式不正确",
  "instance": "/api/v1/users",
  "errors": [
    {
      "field": "email",
      "message": "必须是有效的邮箱地址",
      "code": "INVALID_FORMAT"
    }
  ]
}

分页模式

游标分页(推荐)

// 请求: GET /api/v1/users?cursor=abc123&limit=20
{
  "data": [...],
  "pagination": {
    "next_cursor": "def456",
    "has_more": true,
    "limit": 20
  }
}

偏移分页

// 请求: GET /api/v1/users?page=2&per_page=20
{
  "data": [...],
  "pagination": {
    "page": 2,
    "per_page": 20,
    "total": 150,
    "total_pages": 8
  }
}
方式 优势 劣势 适用场景
游标 性能好、无跳页问题 不能跳到任意页 无限滚动、实时数据
偏移 可跳页、直观 大偏移量性能差 管理后台、固定列表

过滤与排序

GET /api/v1/users?status=active&role=admin          # 过滤
GET /api/v1/users?sort=-created_at,name              # 排序(-表示降序)
GET /api/v1/users?fields=id,name,email               # 字段选择
GET /api/v1/users?q=张三                              # 搜索

版本策略

策略 示例 优势 劣势
URL 路径 /api/v1/users 最直观、易于路由 URL 变化
请求头 Accept: application/vnd.api+json;version=1 URL 不变 不便调试
查询参数 /api/users?version=1 简单 缓存困难

推荐: URL 路径版本(/api/v1/),最广泛使用且最易理解。

认证模式

JWT Bearer Token

Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

流程:
1. POST /api/v1/auth/login → 返回 access_token + refresh_token
2. 后续请求携带 Authorization: Bearer {access_token}
3. 过期后 POST /api/v1/auth/refresh → 新的 access_token

API Key

X-API-Key: sk_live_abc123

适用: 服务间通信、第三方集成

OpenAPI 3.1 快速模板

openapi: 3.1.0
info:
  title: [API 名称]
  version: 1.0.0
  description: [API 描述]
servers:
  - url: https://api.example.com/v1
    description: 生产环境
  - url: http://localhost:3000/v1
    description: 开发环境

paths:
  /users:
    get:
      summary: 获取用户列表
      operationId: listUsers
      tags: [Users]
      parameters:
        - $ref: '#/components/parameters/PageParam'
        - $ref: '#/components/parameters/LimitParam'
      responses:
        '200':
          description: 成功
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/User'
                  pagination:
                    $ref: '#/components/schemas/Pagination'
    post:
      summary: 创建用户
      operationId: createUser
      tags: [Users]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateUserRequest'
      responses:
        '201':
          description: 创建成功
        '400':
          $ref: '#/components/responses/BadRequest'

components:
  schemas:
    User:
      type: object
      required: [id, name, email]
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        email:
          type: string
          format: email
        created_at:
          type: string
          format: date-time
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

security:
  - BearerAuth: []

设计原则

必须做

  • 资源导向,使用正确的 HTTP 方法
  • 一致的命名约定(snake_case 或 camelCase,全局统一)
  • 完整的 OpenAPI 3.1 规范
  • 合理的错误响应(附可执行的信息)
  • 集合端点实现分页
  • 清晰的版本和废弃策略
  • 提供请求/响应示例

绝不做

  • URI 中使用动词(用 /users/{id} 而非 /getUser/{id}
  • 返回不一致的响应结构
  • 忽略 HTTP 状态码语义
  • 不做版本策略
  • 暴露实现细节到 API
  • 无迁移方案的破坏性变更
  • 忽略速率限制

知识参考

REST 架构、OpenAPI 3.1、GraphQL、HTTP 语义、JSON:API、HATEOAS、OAuth 2.0、JWT、RFC 7807 Problem Details、API 版本模式、分页策略、速率限制、Webhook 设计、SDK 生成

Weekly Installs
1
GitHub Stars
15
First Seen
13 days ago
Installed on
amp1
cline1
opencode1
cursor1
kimi-cli1
codex1