API设计Skill designing-apis

API设计技能专注于创建安全、可扩展和可维护的应用程序编程接口,采用RESTful、GraphQL和事件驱动模式。它涵盖资源设计、版本控制、错误处理、分页、速率限制和安全性,适用于设计新API、演进现有API或为团队建立API标准。关键词:API设计、RESTful、GraphQL、事件驱动、安全、可扩展、可维护、版本控制、错误处理。

架构设计 0 次安装 0 次浏览 更新于 3/23/2026

名称: designing-apis 描述: 设计安全、可扩展和可维护的API,使用RESTful、GraphQL和事件驱动模式。适用于设计新API、演进现有API或为团队建立API标准。

设计API

设计结构良好、可扩展的API,使用REST、GraphQL或事件驱动模式。专注于资源设计、版本控制、错误处理、分页、速率限制和安全性。

何时使用此技能

使用当:

  • 设计新的REST、GraphQL或事件驱动API
  • 为团队或组织建立API设计标准
  • 在REST、GraphQL、WebSockets或消息队列之间选择
  • 规划API版本控制和破坏性变更管理
  • 定义错误响应格式和HTTP状态码使用
  • 实现分页、过滤和速率限制模式
  • 设计OAuth2流程或API密钥认证
  • 创建OpenAPI或AsyncAPI规范

不要用于:

  • 实现代码(使用api-patterns技能处理Express、FastAPI代码)
  • 认证实现(使用auth-security技能处理JWT、会话)
  • API测试策略(使用testing-strategies技能)
  • API部署和基础设施(使用deploying-applications技能)

核心设计原则

资源导向设计(REST)

使用名词表示资源,不要在URL中使用动词:

✓ GET    /users              列出用户
✓ GET    /users/123          获取用户123
✓ POST   /users              创建用户
✓ PATCH  /users/123          更新用户123
✓ DELETE /users/123          删除用户123

✗ GET    /getUsers
✗ POST   /createUser

为关系嵌套资源(限制深度到2-3层):

✓ GET /users/123/posts
✓ GET /users/123/posts/456/comments
✗ GET /users/123/posts/456/comments/789/replies  (太深)

有关完整REST模式,请参阅references/rest-design.md

HTTP方法语义

方法 幂等性 安全性 用途 成功状态
GET 读取资源 200 OK
POST 创建资源 201 Created
PUT 替换整个资源 200 OK, 204 No Content
PATCH 更新特定字段 200 OK, 204 No Content
DELETE 移除资源 204 No Content, 200 OK

幂等性意味着多个相同请求与一个请求具有相同效果。

HTTP状态码

成功(2xx):

  • 200 OK, 201 Created, 204 No Content

客户端错误(4xx):

  • 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found
  • 409 Conflict, 422 Unprocessable Entity, 429 Too Many Requests

服务器错误(5xx):

  • 500 Internal Server Error, 503 Service Unavailable

有关完整状态码指南,请参阅references/rest-design.md

API风格选择

决策矩阵

因素 REST GraphQL WebSocket 消息队列
公共API ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐
复杂数据 ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐
缓存 ⭐⭐⭐⭐⭐ ⭐⭐
实时性 ⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
简单性 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐

快速选择

  • 公共API,CRUD操作 → REST
  • 复杂数据,灵活查询 → GraphQL
  • 实时性,双向通信 → WebSockets
  • 事件驱动,微服务 → 消息队列

有关详细协议选择,请参阅references/protocol-selection.md

API版本控制

URL路径版本控制(推荐)

https://api.example.com/v1/users
https://api.example.com/v2/users

优点:明确,易于实现和测试 缺点:维护开销

替代策略

  • 基于头部的:Accept-Version: v1
  • 媒体类型:Accept: application/vnd.example.v1+json
  • 查询参数:?version=1(不推荐)

破坏性变更管理

时间线:

  1. 第0个月:宣布弃用
  2. 第1-3个月:迁移期
  3. 第4-6个月:弃用警告
  4. 第6个月:终止(返回410 Gone)

包括弃用头部:

Deprecation: true
Sunset: Sat, 31 Dec 2025 23:59:59 GMT
Link: </api/v2/users>; rel="successor-version"

有关完整版本控制指南,请参阅references/versioning-strategies.md

错误响应标准

RFC 7807问题详情(推荐)

{
  "type": "https://api.example.com/errors/validation",
  "title": "验证错误",
  "status": 400,
  "detail": "一个或多个字段验证失败",
  "errors": [
    {
      "field": "email",
      "message": "必须是有效的电子邮件地址",
      "code": "INVALID_EMAIL"
    }
  ]
}

内容类型:application/problem+json

有关完整错误模式,请参阅references/error-handling.md

分页模式

策略选择

场景 策略 原因
小型数据集(<1000) 基于偏移 简单,页码
大型数据集(>10K) 基于游标 高效,处理写入
排序数据 键集 一致结果
实时流 基于游标 处理新项

基于偏移(简单)

GET /users?limit=20&offset=40

响应包括:limit, offset, total, currentPage

基于游标(可扩展)

GET /users?limit=20&cursor=eyJpZCI6MTIzfQ==

游标是base64编码的JSON,包含位置信息。 响应包括:nextCursor, hasNext

有关实现细节,请参阅references/pagination-patterns.md

速率限制

令牌桶算法

  • 每个用户有一个带令牌的桶
  • 每个请求消耗1个令牌
  • 令牌以恒定速率补充
  • 空桶拒绝请求

速率限制头部

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 73
X-RateLimit-Reset: 1672531200

当超过时(429):

Retry-After: 3600

策略

  • 每用户:100请求/小时
  • 每API密钥:1000请求/小时
  • 每IP:50请求/小时(未认证)
  • 分层:免费(100/小时),专业(1000/小时),企业(10000/小时)

有关实现模式,请参阅references/rate-limiting.md

API安全设计

OAuth 2.0流程

授权码流程(Web应用):

  1. 重定向用户到授权服务器
  2. 用户授予权限
  3. 交换代码获取访问令牌
  4. 使用令牌进行API请求

客户端凭证流程(服务到服务):

  1. 使用客户端ID和密钥认证
  2. 接收访问令牌
  3. 使用令牌进行API请求

基于范围的授权

定义细粒度权限:

read:users    - 读取用户数据
write:users   - 创建/更新用户
delete:users  - 删除用户
admin:*       - 完全管理员访问

API密钥管理

使用头部基础密钥:

X-API-Key: sk_live_abc123xyz456

最佳实践:

  • 前缀带环境:sk_live_*, sk_test_*
  • 仅存储哈希密钥
  • 支持密钥轮换
  • 跟踪最后使用时间戳

有关完整安全模式,请参阅references/authentication.md

OpenAPI规范

基本结构

openapi: 3.1.0
info:
  title: 用户管理API
  version: 2.0.0

paths:
  /users:
    get:
      summary: 列出用户
      parameters:
        - name: limit
          in: query
          schema:
            type: integer
      responses:
        '200':
          description: 成功
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserList'

OpenAPI启用:

  • 代码生成(服务器存根,客户端SDK)
  • 验证(请求/响应检查)
  • 模拟服务器(针对规范测试)
  • 文档(交互式文档)

有关完整OpenAPI示例,请参阅examples/openapi/

AsyncAPI规范

事件驱动API

AsyncAPI定义基于消息的API(WebSockets、Kafka、MQTT):

asyncapi: 3.0.0
info:
  title: 订单事件API

channels:
  orders/created:
    address: orders.created
    messages:
      orderCreated:
        payload:
          type: object
          properties:
            orderId:
              type: string

有关AsyncAPI示例,请参阅examples/asyncapi/

GraphQL设计

模式结构

type User {
  id: ID!
  username: String!
  posts(limit: Int): [Post!]!
}

type Query {
  user(id: ID!): User
  users(limit: Int): [User!]!
}

type Mutation {
  createUser(input: CreateUserInput!): User!
}

N+1问题解决方案

使用DataLoader批量请求:

const userLoader = new DataLoader(async (userIds) => {
  // 单次查询所有用户
  const users = await db.users.findByIds(userIds);
  return userIds.map(id => users.find(u => u.id === id));
});

有关GraphQL模式,请参阅references/graphql-design.md

快速参考表

分页策略选择

场景 策略
小型数据集 基于偏移
大型数据集 基于游标
排序数据 键集
实时流 基于游标

版本控制策略选择

因素 URL路径 头部 媒体类型
可见性 ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐
简单性 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐
最适合 大多数API 内部API 内容协商

与其他技能集成

  • api-patterns:在Express、FastAPI、Go中实现API设计
  • auth-security:实现OAuth2、JWT、会话管理
  • database-design:为API资源设计数据库模式
  • testing-strategies:API测试(集成、契约、负载)
  • deploying-applications:部署和扩展API
  • observability:监控API性能和错误

附加资源

详细指导:

  • references/rest-design.md - RESTful模式和最佳实践
  • references/graphql-design.md - GraphQL模式和解析器模式
  • references/versioning-strategies.md - 综合版本控制指南
  • references/error-handling.md - RFC 7807实现细节
  • references/pagination-patterns.md - 分页实现模式
  • references/rate-limiting.md - 速率限制算法和策略
  • references/authentication.md - OAuth2、API密钥、范围
  • references/protocol-selection.md - 选择正确的API风格

工作示例:

  • examples/openapi/ - 完整OpenAPI 3.1规范
  • examples/asyncapi/ - 事件驱动API规范
  • examples/graphql/ - GraphQL模式和模式

验证和工具:

  • scripts/validate-openapi.sh - 验证OpenAPI规范