mcpField
A
api-development-expert

api-development-expert

github.com/oimiragieo开发4468 次安装17 周前更新
代码仓库

关于 api-development-expert

面向开发者的 API 开发技能,依据 REST、OpenAPI、安全性和性能实践审查代码与设计,并提供改进和架构建议。

主要功能

  1. 01REST 资源与 HTTP 方法设计
  2. 02OpenAPI 模式与文档实践
  3. 03版本管理与限流模式
  4. 04身份验证与错误处理建议
  5. 05缓存与性能优化建议

适用场景

  1. 01审查 REST 端点设计
  2. 02改进 OpenAPI 规范
  3. 03规划 API 身份验证与版本管理
  4. 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.md
hooks/
post-execute.cjs
pre-execute.cjs
references/
research-requirements.md
rules/
api-development-expert.md
schemas/
input.schema.json
output.schema.json
scripts/
main.cjs
templates/
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: 1000
    • X-RateLimit-Remaining: 999
    • X-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.0OpenAPI 3.1
JSON Schema 合规性子集 + 扩展完整支持 JSON Schema 2020-12
可空字段nullable: truetype: ["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
  • query HTTP 操作和 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基于资源的 URIGET /users/123
2HTTP 方法 + 状态码DELETE /users/123 返回 204
3HATEOAS(超媒体控件)响应包含 _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 流量重塑带来的架构要求——规划高流量、适合流式处理的子图操作
用法示例: ``` User: "Review this code for api-development best practices" Agent: [Analyzes code against consolidated guidelines and provides specific feedback] ```

铁律

  1. 从第一天起就始终为 API 设置版本——除非提升版本,否则绝不引入破坏性变更;使用 URI 版本控制(/v1/、/v2/),让客户端能按自己的计划迁移。
  2. 绝不为错误返回 200 OK——使用正确的 HTTP 状态码:400(错误请求)、401(未授权)、403(禁止访问)、404(未找到)、422(验证失败)、500(服务器错误)。
  3. 始终使用 OpenAPI 3.1 记录每个端点——未记录的 API 无法安全使用;OpenAPI 3.1 提供对 JSON Schema 2020-12 的兼容性和 webhook 支持。
  4. 绝不在错误响应中包含敏感数据——堆栈跟踪、数据库架构和内部文件路径都可能被用于攻击;只返回机器可读的错误代码和安全消息。
  5. 始终对所有公共端点实施速率限制——未经过身份验证且没有速率限制的端点容易遭受 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

完成之后: 记录发现的任何新模式或例外情况。

假定可能发生中断:你的上下文可能会重置。如果内容没有记录在记忆中,就等于没有发生。

评论

支持 Markdown