Skip to main content
ClaudeWave
ES, Spanish
Skill2k estrellas del repoactualizado 7mo ago

api-design

This Claude Code skill provides production-grade REST API design patterns including resource naming conventions, HTTP status codes, pagination, filtering, error response handling, API versioning, and rate limiting strategies. Use it when designing new API endpoints, reviewing existing API contracts, implementing pagination or filtering features, building error handling systems, planning API versioning approaches, or developing public or partner-facing APIs.

Instalar en Claude Code
Copiar
git clone --depth 1 https://github.com/xu-xiang/everything-claude-code-zh /tmp/api-design && cp -r /tmp/api-design/.agents/skills/api-design ~/.claude/skills/api-design
Después abre una sesión nueva de Claude Code; el skill carga automáticamente.

SKILL.md

# API 设计模式(API Design Patterns)

用于设计一致且开发者友好的 REST API 的约定与最佳实践。

## 何时激活(When to Activate)

- 设计新的 API 端点(Endpoint)
- 审查现有的 API 合约
- 添加分页、过滤或排序功能
- 为 API 实现错误处理
- 规划 API 版本化策略
- 构建公开或面向合作伙伴的 API

## 资源设计(Resource Design)

### URL 结构

```
# 资源应为名词、复数、小写、短横线命名法(kebab-case)
GET    /api/v1/users
GET    /api/v1/users/:id
POST   /api/v1/users
PUT    /api/v1/users/:id
PATCH  /api/v1/users/:id
DELETE /api/v1/users/:id

# 关系的子资源
GET    /api/v1/users/:id/orders
POST   /api/v1/users/:id/orders

# 不符合 CRUD 的操作(谨慎使用动词)
POST   /api/v1/orders/:id/cancel
POST   /api/v1/auth/login
POST   /api/v1/auth/refresh
```

### 命名规则

```
# 推荐(GOOD)
/api/v1/team-members          # 多词资源使用短横线命名法(kebab-case)
/api/v1/orders?status=active  # 使用查询参数进行过滤
/api/v1/users/123/orders      # 嵌套资源表示归属关系

# 错误(BAD)
/api/v1/getUsers              # URL 中包含动词
/api/v1/user                  # 使用单数(应使用复数)
/api/v1/team_members          # URL 中使用蛇形命名法(snake_case)
/api/v1/users/123/getOrders   # 嵌套资源中包含动词
```

## HTTP 方法与状态码(HTTP Methods and Status Codes)

### 方法语义

| 方法 | 幂等性(Idempotent) | 安全性(Safe) | 用途 |
|--------|-----------|------|---------|
| GET | 是 | 是 | 获取资源 |
| POST | 否 | 否 | 创建资源,触发操作 |
| PUT | 是 | 否 | 完整替换资源 |
| PATCH | 否* | 否 | 部分更新资源 |
| DELETE | 是 | 否 | 删除资源 |

*通过正确的实现,PATCH 也可以设计为幂等。

### 状态码参考

```
# 成功(Success)
200 OK                    — GET, PUT, PATCH(包含响应体)
201 Created               — POST(需包含 Location 响应头)
204 No Content            — DELETE, PUT(不含响应体)

# 客户端错误(Client Errors)
400 Bad Request           — 校验失败,JSON 格式错误
401 Unauthorized          — 缺失或无效的身份验证
403 Forbidden             — 已验证身份但未获得授权
404 Not Found             — 资源不存在
409 Conflict              — 重复条目,状态冲突
422 Unprocessable Entity  — 语义错误(JSON 正确但数据非法)
429 Too Many Requests     — 超出速率限制

# 服务端错误(Server Errors)
500 Internal Server Error — 意外错误(绝不要暴露详细堆栈)
502 Bad Gateway           — 上游服务失败
503 Service Unavailable   — 暂时性过载,需包含 Retry-After
```

### 常见错误

```
# 错误:所有响应都返回 200
{ "status": 200, "success": false, "error": "Not found" }

# 推荐:语义化地使用 HTTP 状态码
HTTP/1.1 404 Not Found
{ "error": { "code": "not_found", "message": "User not found" } }

# 错误:校验错误返回 500
# 推荐:返回 400 或 422 并提供字段级详情

# 错误:创建资源返回 200
# 推荐:返回 201 并附带 Location 响应头
HTTP/1.1 201 Created
Location: /api/v1/users/abc-123
```

## 响应格式(Response Format)

### 成功响应

```json
{
  "data": {
    "id": "abc-123",
    "email": "alice@example.com",
    "name": "Alice",
    "created_at": "2025-01-15T10:30:00Z"
  }
}
```

### 集合响应(含分页)

```json
{
  "data": [
    { "id": "abc-123", "name": "Alice" },
    { "id": "def-456", "name": "Bob" }
  ],
  "meta": {
    "total": 142,
    "page": 1,
    "per_page": 20,
    "total_pages": 8
  },
  "links": {
    "self": "/api/v1/users?page=1&per_page=20",
    "next": "/api/v1/users?page=2&per_page=20",
    "last": "/api/v1/users?page=8&per_page=20"
  }
}
```

### 错误响应

```json
{
  "error": {
    "code": "validation_error",
    "message": "Request validation failed",
    "details": [
      {
        "field": "email",
        "message": "Must be a valid email address",
        "code": "invalid_format"
      },
      {
        "field": "age",
        "message": "Must be between 0 and 150",
        "code": "out_of_range"
      }
    ]
  }
}
```

### 响应封装变体

```typescript
// 方案 A:包含 data 包装器的信封模式(推荐用于公开 API)
interface ApiResponse<T> {
  data: T;
  meta?: PaginationMeta;
  links?: PaginationLinks;
}

interface ApiError {
  error: {
    code: string;
    message: string;
    details?: FieldError[];
  };
}

// 方案 B:扁平化响应(更简单,常用于内部 API)
// 成功:直接返回资源对象
// 失败:返回错误对象
// 通过 HTTP 状态码进行区分
```

## 分页(Pagination)

### 基于偏移量(Offset-Based,简单)

```
GET /api/v1/users?page=2&per_page=20

# 实现
SELECT * FROM users
ORDER BY created_at DESC
LIMIT 20 OFFSET 20;
```

**优点:** 易于实现,支持“跳转到第 N 页”。
**缺点:** 在大偏移量时速度慢(OFFSET 100000),且在并发插入时可能出现数据重复或遗漏。

### 基于游标(Cursor-Based,可扩展)

```
GET /api/v1/users?cursor=eyJpZCI6MTIzfQ&limit=20

# 实现
SELECT * FROM users
WHERE id > :cursor_id
ORDER BY id ASC
LIMIT 21;  -- 多获取一个以确定是否有下一页(has_next)
```

```json
{
  "data": [...],
  "meta": {
    "has_next": true,
    "next_cursor": "eyJpZCI6MTQzfQ"
  }
}
```

**优点:** 无论在什么位置性能都保持一致,在并发插入时保持稳定。
**缺点:** 无法跳转到任意页,游标是不透明的(不可读)。

### 选型建议

| 使用场景 | 分页类型 |
|----------|----------------|
| 管理后台、小型数据集 (<10K) | 偏移量(Offset) |
| 无限滚动、Feed 流、大型数据集 | 游标(Cursor) |
| 公开 API | 默认游标,可选支持偏移量 |
| 搜索结果 | 偏移量(用户通常期望看到页码) |

## 过滤、排序与搜索(Filtering, Sorting, and Search)

### 过滤

```
# 简单相等
GET /api/v1/orders?status=active&customer_id=abc-123

# 比较操作符(使用括号标记法)
GET /api/v1/products?price[gte]=10&price[lte]=100
GET /api/v1/orders?created_at[after]=2025-01-01

# 多个值(逗号分隔)
GET /api/v1/products?category=electronics,clothing

# 嵌套字段(点标记法)
GET /api/v1/orders?customer.country=US
```

### 排序

```
# 单字段(前缀 - 表示降序)
GET /api/v1/products?sort=-created_at

# 多字段(逗号分隔)
GET /api/v1/products?sort=-featured,price,-created_at
```

### 全文搜索

```
# 搜索查询参数
GET /api/v1/products?q=wireless+headphones

# 字段特定搜索
GET /api/v1/users?email=alice
```

### 稀疏字段集(Sparse Fieldsets)

```
# 仅返回指定字段(减小负载)
GET /api/v1/users?fields=id,name,email
GET /api/v1/orders?fields=id,total,status&include=customer.name
```

## 身份验证与授权(Authentication and Authorization)

### 基于令牌的认证

```
# Authorization 标头中的 Bearer 令牌
GET /api/v1/users
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

# API 密钥(用于服务间调用)
GET /api/v1/data
X-API-Key: sk_live_abc123
```

### 授权模式

```typescript
// 资源级:检查所有权
app.get("/api/v1/orders/:id", async (req, res) => {
  const order = await Order.findById(req.params.id);
  if (!order) return res.status(404).json({ error: { code: "not_found" } });
  if (order.userId !== req.user.id) return res.status(403).json({ error: { code: "forbidden" } });
  return res.json({ data: order });
});

// 基于角色:检查权限
app.delete("/api/v1/users/:id", requireRole("admin"), async (req, res) => {
  await User.delete(req.params.id);
  return res.status(204).send();
});
```

## 速率限制(Rate Limiting)

### 响应头

```
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1640000000

# 超过限制
architectSubagent

用于系统设计、可扩展性及技术决策的软件架构专家。在规划新功能、重构大型系统或做出架构决策时请主动(PROACTIVELY)使用。

article-writingSkill

编写文章、指南、博客、教程、时事通讯(Newsletter)等长内容,支持从示例或品牌指南中提取独特的语感语调。适用于需要撰写超过一个段落的精炼文本,尤其是对语气一致性、结构和可信度有较高要求时。

backend-patternsSkill

后端架构模式、API 设计、数据库优化以及 Node.js、Express 和 Next.js API 路由的服务端最佳实践。

build-error-resolverSubagent

构建与 TypeScript 错误修复专家。当构建失败或出现类型错误时,请主动(PROACTIVELY)使用。仅修复构建/类型错误,保持最小差异(diff),不进行架构性修改。重点是快速使构建通过(get the build green)。

chief-of-staffSubagent

个人通讯幕僚 (Chief of Staff),负责分拣电子邮件、Slack、LINE 和 Messenger。将消息分类为 4 个级别 (skip/info_only/meeting_info/action_required),生成草稿回复,并通过钩子 (Hooks) 强制执行发送后的后续跟进。适用于管理多渠道通讯工作流。

clawSlash Command

启动 NanoClaw 智能体 (Agent) REPL — 一个由 claude CLI 驱动的持久化、会话感知 (session-aware) 的 AI 助手。

clickhouse-ioSkill

ClickHouse 数据库模式、查询优化、分析以及高性能分析工作负载的数据工程最佳实践。

code-reviewerSubagent

资深代码审查(Code Review)专家。主动审查代码的质量、安全性与可维护性。在编写或修改代码后立即使用。所有代码变更**必须使用**此工具。