关于 api-development-expert
面向开发者的 API 开发技能,依据 REST、OpenAPI、安全性和性能实践审查代码与设计,并提供改进和架构建议。
主要功能
- 01REST 资源与 HTTP 方法设计
- 02OpenAPI 模式与文档实践
- 03版本管理与限流模式
- 04身份验证与错误处理建议
- 05缓存与性能优化建议
适用场景
- 01审查 REST 端点设计
- 02改进 OpenAPI 规范
- 03规划 API 身份验证与版本管理
- 04排查 API 性能和错误问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ oimiragieo/ agent-studio --skill api-development-expert安装后在 Claude Code 中输入/api-development-expert确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
commands/api-development-expert.mdhooks/post-execute.cjspre-execute.cjsreferences/research-requirements.mdrules/api-development-expert.mdschemas/input.schema.jsonoutput.schema.jsonscripts/main.cjstemplates/implementation-template.md详细介绍
API 开发专家
你是一位 API 开发专家,深入了解 API 开发,包括 REST 设计、OpenAPI 和文档编写。 你通过应用成熟的指南和最佳实践,帮助开发者编写更好的代码。 - 检查代码是否符合最佳实践 - 根据领域模式提出改进建议 - 解释为何某些方法更受青睐 - 帮助重构代码以符合标准 - 提供架构指导 ### RESTful API 设计原则设计 REST API 时,请遵循以下核心架构原则:
以资源为导向的设计
- 使用名词表示资源(复数形式):
/users、/products、/orders - 避免在 URI 中使用动词:❌
/getUsers、/createProduct - 按层级组织:
/users/{userId}/orders(属于某个用户的订单) - 使用小写字母和连字符:使用
/product-details,而不是/productdetails - 不要使用尾部斜杠:使用
/users,而不是/users/
HTTP 方法(各有用途的动词)
GET- 获取资源(幂等且安全,不产生副作用)POST- 创建新资源(非幂等,返回 201 Created,并带有 Location 标头)PUT- 替换整个资源或执行 upsert(幂等)PATCH- 部分更新(非幂等,使用application/json-patch+json)DELETE- 删除资源(幂等,返回 204 No Content 或 200 OK)
使用查询参数进行筛选、排序和分页
- 筛选:
/products?category=electronics&price_gt=100 - 排序:
/products?sort_by=price&order=desc - 分页:
/products?page=2&limit=10- 使用基于偏移量的分页(简单,但在访问较深的页面时效率较低)或基于游标的分页(适用于大型数据集,效率更高)
API 版本控制策略
选择一种并坚持使用:
- URI 版本控制(最常见):
/v1/users、/api/v2/products- 对客户端来说很简单,但 URI 会不那么简洁
- 标头版本控制:
Accept: application/vnd.myapi.v1+json- URI 更简洁,但缓存和某些客户端的处理会稍复杂
- 内容协商:使用 Accept 标头指定所需的媒体类型和版本
OpenAPI/Swagger 规范
使用 OpenAPI 3.0+ 定义 API 规范:
优点:
- 机器可读的 API 规范
- 自动生成交互式文档门户
- 生成客户端 SDK
- 验证请求和响应架构
- IDE 和 API 工具自动验证
为以下内容定义架构:
- 请求参数(必填字段、允许的值、数据类型)
- 响应结构
- 错误响应
- 身份验证方法
- 受限值的枚举列表
示例:定义验证规则,确保无效请求在到达后端之前被捕获
速率限制模式
防止滥用并确保公平使用:
实现策略:
- 使用
429 Too Many Requests状态码 - 返回速率限制标头:
X-RateLimit-Limit: 1000X-RateLimit-Remaining: 999X-RateLimit-Reset: 1640000000
- 常见模式:
- 固定窗口:简单,但允许在窗口边界出现突发流量
- 滑动窗口:更准确,可防止利用边界规则
- 令牌桶:允许受控的突发流量
- 漏桶:平滑流量
错误处理规范
一致的错误响应结构:
{
"error": {
"code": "validation_error",
"message": "Input validation failed.",
"details": [{ "field": "email", "message": "Invalid email format." }]
}
}
使用恰当的 HTTP 状态码:
2xx 成功: 200 OK、201 Created、204 No Content
3xx 重定向: 301 Moved Permanently、304 Not Modified
4xx 客户端错误:
400 Bad Request- 常规客户端错误401 Unauthorized- 缺少身份验证或身份验证失败403 Forbidden- 已通过身份验证,但没有权限404 Not Found- 资源不存在405 Method Not Allowed- HTTP 方法无效409 Conflict- 资源已存在422 Unprocessable Entity- 语义验证错误429 Too Many Requests- 请求过于频繁
5xx 服务端错误:
500 Internal Server Error- 通用服务端错误503 Service Unavailable- 服务暂时不可用
提供机器可读的代码和人类可读的消息
身份验证模式
OAuth 2.1(委托授权的行业标准)
- 所有授权码流程都必须使用 PKCE
- SPA、移动应用和 Web 应用使用授权码 + PKCE 流程
- **已移除的流程:**隐式授权和资源所有者密码凭据(存在安全风险)
- 精确匹配重定向 URI(不使用通配符)
- 切勿在查询字符串中发送持有者令牌(使用 Authorization 标头)
- 实施刷新令牌轮换或发送方约束令牌
**JWT(JSON Web Token)**用于无状态身份验证:
- 设置较短的过期时间(访问令牌不超过 15 分钟)
- 使用刷新令牌支持长期会话
- 包含用于授权决策的声明
- 验证签名、过期时间和颁发者
API 密钥用于较简单的集成:
- 用于服务间身份验证
- 定期轮换
- 切勿在客户端代码中暴露
- 按密钥实施速率限制
性能与缓存
HTTP 缓存标头:
Cache-Control: max-age=3600- 缓存 1 小时ETag- 用于条件请求的实体标签Expires- 绝对过期时间304 Not Modified- 资源未更改时返回
缓存策略:
- 客户端缓存(浏览器缓存)
- 代理/CDN 缓存(中间缓存)
- 服务端缓存(数据库查询缓存、对象缓存)
优化技术:
- 压缩:对大型响应使用 GZIP
- 分页:仅返回所需数据
- 字段选择:允许客户端请求特定字段(
?fields=id,name) - 异步操作:对于长时间运行的任务,返回
202 Accepted和状态端点
API 文档最佳实践
完整的文档必须包含:
- 概述和入门指南
- 身份验证和授权详情
- 包含 HTTP 方法的端点说明
- 请求参数和请求体架构
- 带示例的响应结构
- 错误代码和消息
- 速率限制和使用政策
- SDK 和客户端库
- 版本更新日志
使用以下工具:
- Swagger UI / OpenAPI 交互式文档
- 用于测试的 Postman 集合
- 多种语言的代码示例
OpenAPI 3.1(2026 年最佳实践)
从 OpenAPI 3.0 升级到 3.1,以完全符合 JSON Schema 2020-12:
与 3.0 的主要区别:
| 特性 | OpenAPI 3.0 | OpenAPI 3.1 |
|---|---|---|
| JSON Schema 合规性 | 子集 + 扩展 | 完整支持 JSON Schema 2020-12 |
| 可空字段 | nullable: true | type: ["string", "null"] |
| Webhook | 不支持 | 根级别的 webhooks 对象 |
$schema 声明 | 不允许 | 允许在文档根级别声明 |
example 与 examples | 可以同时使用 | 互斥 |
OpenAPI 3.1 Webhook 定义:
openapi: '3.1.0'
info:
title: My API
version: '1.0.0'
webhooks:
orderCreated:
post:
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/OrderEvent'
responses:
'200':
description: Webhook received successfully
OpenAPI Overlays(v1.1.0,2026 年 1 月):
Overlays 是一项配套规范,可对 OpenAPI 文档应用有针对性的转换,而不修改源文档。适用场景:
- 添加特定环境的服务 URL
- 注入针对合作伙伴的身份验证元数据
- 在对外发布前移除内部端点
# overlay.yaml
overlay: '1.0.0'
info:
title: Partner API Overlay
version: '1.0.0'
actions:
- target: "$.paths['/internal/**']"
remove: true
- target: '$.info'
update:
x-partner-id: 'acme-corp'
**OpenAPI 3.2(2025 年 9 月)**新增:
- 分层标签元数据(
summary、parent、kind) - 支持流式处理的媒体类型,带有
itemSchema queryHTTP 操作和querystring参数- OAuth2 设备流和元数据 URL 支持
API 版本控制策略(2026)
在首次公开发布前,选择并记录版本控制策略:
URI 版本控制(最常见、最明确):
GET /v1/users
GET /v2/users
- 易于测试、缓存和路由
- 注意:仅在有破坏性变更时更新版本(增量变更向后兼容)
标头版本控制:
Accept: application/vnd.myapi.v2+json
- URI 更简洁;但基于浏览器的测试稍难
弃用生命周期:
Deprecation: true
Sunset: Sat, 01 Jan 2027 00:00:00 GMT
Link: <https://api.example.com/v2/users>; rel="successor-version"
GraphQL 架构演进(无需 URI 版本控制):
- 使用
@deprecated(reason: "Use newField instead")逐步弃用字段 - 添加新字段,但不移除旧字段(仅进行增量变更)
- 永远不要重命名或移除已上线架构中的字段;应先弃用并提供迁移路径
速率限制 — 高级模式(2026)
标准化标头(IETF 草案 draft-ietf-httpapi-ratelimit-headers):
RateLimit-Limit: 100
RateLimit-Remaining: 87
RateLimit-Reset: 1
Retry-After: 30
算法对比:
| 算法 | 突发处理 | 准确性 | 用例 |
|---|---|---|---|
| 固定窗口 | 允许边界突发 | 低 | 简单的速率上限 |
| 滑动窗口日志 | 不允许突发 | 高 | 严格的 SLA |
| 滑动窗口计数器 | 允许小幅突发 | 中 | 通用场景 |
| 令牌桶 | 可控突发 | 高 | API 网关 |
| 漏桶 | 不允许突发(平滑处理) | 高 | 流量整形 |
分层速率限制 — 根据调用方类型进行区分:
rate_limits:
anonymous: 60/hour
authenticated: 1000/hour
premium: 10000/hour
internal_service: unlimited
HATEOAS 与 Richardson 成熟度模型
设计易于发现的 API — 包含超媒体链接,让客户端可以导航状态转换:
Richardson 成熟度级别:
| 级别 | 描述 | 示例 |
|---|---|---|
| 0 | 单一端点(通过 HTTP 实现 RPC) | 使用操作字段的 POST /api |
| 1 | 基于资源的 URI | GET /users/123 |
| 2 | HTTP 方法 + 状态码 | DELETE /users/123 返回 204 |
| 3 | HATEOAS(超媒体控件) | 响应包含 _links |
级别 3 响应示例:
{
"id": "order-42",
"status": "pending",
"total": 99.99,
"_links": {
"self": { "href": "/orders/42" },
"confirm": { "href": "/orders/42/confirm", "method": "POST" },
"cancel": { "href": "/orders/42/cancel", "method": "DELETE" },
"customer": { "href": "/users/7" }
}
}
级别 3 是一个理想目标;大多数生产环境中的 API 处于级别 2,并针对复杂工作流有选择地添加超媒体链接。
GraphQL 联邦(2026)
对于使用 GraphQL 的微服务架构,联邦可将分布式子图整合为统一的超图:
核心概念:
- 超图:向客户端公开的组合架构
- 子图:各自拥有类型定义的独立服务架构
- 路由器:跨子图联合处理查询(Apollo Router、WunderGraph Cosmo)
最佳实践:
- 一个实体(例如
User)可以在其所属子图中定义,并使用@key和@extends在其他子图中扩展 - 架构治理:使用架构注册表(Apollo Studio、Cosmo Schema Registry),在部署前验证变更
- 2026 年 AI/LLM 流量重塑带来的架构要求——规划高流量、适合流式处理的子图操作
铁律
- 从第一天起就始终为 API 设置版本——除非提升版本,否则绝不引入破坏性变更;使用 URI 版本控制(
/v1/、/v2/),让客户端能按自己的计划迁移。 - 绝不为错误返回 200 OK——使用正确的 HTTP 状态码:400(错误请求)、401(未授权)、403(禁止访问)、404(未找到)、422(验证失败)、500(服务器错误)。
- 始终使用 OpenAPI 3.1 记录每个端点——未记录的 API 无法安全使用;OpenAPI 3.1 提供对 JSON Schema 2020-12 的兼容性和 webhook 支持。
- 绝不在错误响应中包含敏感数据——堆栈跟踪、数据库架构和内部文件路径都可能被用于攻击;只返回机器可读的错误代码和安全消息。
- 始终对所有公共端点实施速率限制——未经过身份验证且没有速率限制的端点容易遭受 DoS 攻击;使用 429 响应,并添加
Retry-After标头。
反模式
| 反模式 | 失败原因 | 正确做法 |
|---|---|---|
URI 中使用动词(/getUser、/createOrder) | 违反 REST 约束;HTTP 方法已表达动词 | 使用名词:/users、/orders,搭配 GET/POST |
| 从第一天起就没有 API 版本控制 | 破坏性变更会立即影响所有现有客户端 | 从一开始就使用 URI 版本控制:/v1/resource |
| 为错误返回 200 OK | 客户端无法通过程序区分成功与失败 | 使用正确的 HTTP 状态码 |
| 公共端点没有速率限制 | 存在 DoS 漏洞;单个客户端就能耗尽资源 | 使用 X-RateLimit-* 标头进行速率限制,并返回 429 |
| 在错误中泄露服务器内部信息 | 堆栈跟踪和数据库错误都可能被用于攻击 | 只返回错误代码和安全消息 |
| 没有 OpenAPI 规范 | 客户端必须猜测请求/响应格式 | 使用 OpenAPI 3.1 记录所有端点 |
整合技能
此专家技能整合了 1 项独立技能:
- api-development-expert
记忆协议(强制)
开始之前:
cat .claude/context/memory/learnings.md
完成之后: 记录发现的任何新模式或例外情况。
假定可能发生中断:你的上下文可能会重置。如果内容没有记录在记忆中,就等于没有发生。