CalcGuide · 技术博客主页 / 一页纸学习计划
🔥极高

REST API 设计与实现:从资源建模到可观测 API

分类:Web 与后端 · 路径:docs/topics/rest-api-design/README.md

#rest#api#http#openapi#versioning

用 4~6 周从 URL 资源建模到能写出 OpenAPI 文档 + 鉴权 + 限流 + 版本化的可生产 API

父主题

顶层主题

子主题(4)

REST API 设计与实现:从资源建模到可观测 API

0. 元信息

1. 学习路线

资源与 URL → 方法语义 → 状态码与 problem+json → 分页/过滤 → 认证授权 → 限流配额 → 缓存/ETag → 版本化 → OpenAPI → CORS/Webhook → 可观测与发布

2. 阶段周数分配

阶段4 周6 周备注
1. 资源契约11.5URL、method、error、分页
2. 安全治理11.5OAuth2/JWT、授权、CORS
3. 性能与交付11.5rate-limit、ETag、idempotency、Webhook
4. 契约与运行11.5OpenAPI、版本化、trace、发布

3. 九阶段表

阶段核心知识实践产出可观察学会标准
1资源、集合、子资源、URI商品/订单资源图URL 无动词,边界明确
2GET/POST/PUT/PATCH/DELETE、safe/idempotentCRUD 请求集能解释重试后果
32xx/4xx/5xx、problem+json错误目录401/403/404/409/422 不混用
4cursor 分页、filter、sort、fields列表 endpoint数据变化时不重不漏
5OAuth2、JWT、RBAC/ABAC、CORS权限矩阵对象级授权有测试
6rate-limit、quota、429网关策略返回 Retry-After 并能压测
7Cache-Control、ETag、条件请求缓存实验304 与并发更新可解释
8versioning、OpenAPI 3.1、兼容可 lint 的契约能识别 breaking change
9tracing、Webhook、发布完整 APItrace 可串联同步和异步链路

4. 第一周任务

Day 1 约定:OpenAPI 3.1;JSON;UTF-8;时间用 RFC 3339 UTC;金额用整数最小货币单位;命令用 curl

任务当天交付
Day 1画商品、订单、订单项资源和生命周期资源图与命名表
Day 2为 CRUD 选择 method 与返回码请求/响应矩阵
Day 3定义 problem+json 错误目录8 个错误示例
Day 4设计 cursor、filter、sort列表契约
Day 5写最小 OpenAPI 3.1可校验 YAML
Day 6加 Bearer auth、scope、对象授权权限矩阵
Day 7A:跑通商品/订单正常流;B:补未认证、越权、重复提交、并发更新curl 脚本和结果

可运行契约片段:

openapi: 3.1.0
info: {title: Shop API, version: 1.0.0}
paths:
  /products/{productId}:
    get:
      parameters:
        - {name: productId, in: path, required: true, schema: {type: string}}
      responses:
        '200':
          description: Product
          headers:
            ETag: {schema: {type: string}}
          content:
            application/json:
              schema: {$ref: '#/components/schemas/Product'}
        '404':
          description: Not found
          content:
            application/problem+json:
              schema: {type: object}
components:
  schemas:
    Product:
      type: object
      required: [id, name]
      properties:
        id: {type: string}
        name: {type: string}

5. 阶段通用验收

  1. 契约经 lint 且示例可被 curl 重放;2. 正常、非法、未认证、越权、冲突、超限路径都有测试;3. 写清 method、状态码和 header 的理由;4. 日志不泄露 token/PII;5. 变更前后做兼容检查;6. 指标能区分 client/server error;7. 第三方能只看 OpenAPI 完成调用。

6. 最终验收

7. 综合项目

首选:设计并实现一个完整的电商商品 / 订单 API,含 OpenAPI 文档、鉴权、限流、版本化、可观测。

必须含商品、订单、订单项、库存;cursor 分页;problem+json;ETag/If-Match;Idempotency-Key;OAuth2/JWT;429;Webhook 签名和重试;trace id;兼容迁移说明。

备选:将一套遗留 RPC 接口重构为 REST API 并保留向后兼容。交付 adapter、映射表、双写/影子流量策略和弃用时间线。

8. 推荐开源资料

角色资料用法
契约OpenAPI Specification、Swagger UI、Redoc写、渲染契约
校验/生成Spectral、OpenAPI Generatorlint 与 SDK
客户端Postman、Insomnia、Brunocollection 与环境变量
CLIhttpie、curl可复制的验证脚本
规范风格Stripe、Microsoft、Google API guides比较真实选择
网关Apigee、AWS API Gatewayauth、quota、部署

9. 学习资料汇聚(v0.3 自包含)

9.1 背景与动机

REST 是 Fielding 在 2000 年论文中总结的网络软件架构风格。它强调 client-server、stateless、cache、uniform interface、layered system,可选 code-on-demand。工程里的“REST API”常只取资源和 HTTP 语义。我们要区分架构约束、团队风格和工具默认值。

9.2 概念地图

flowchart LR
  Resource[资源/URL] --> Method[HTTP method]
  Method --> Status[状态码/problem+json]
  Resource --> Query[分页/过滤]
  Auth[OAuth2/JWT] --> Authorization[RBAC/ABAC/对象授权]
  Gateway[API Gateway] --> Rate[rate-limit/quota]
  Method --> Cache[Cache-Control/ETag]
  Contract[OpenAPI/JSON Schema] --> Client[SDK/Postman/curl]
  Version[版本化] --> Contract
  Contract --> Runtime[实现]
  Runtime --> Trace[日志/指标/tracing]
  Runtime --> Webhook[Webhook/异步]

资源契约决定请求形状。安全、流控、缓存和兼容约束它的运行行为。OpenAPI 连接设计、实现、测试和客户端。trace 证明请求在同步与异步链路中发生了什么。

9.3 基础知识讲解

9.3.1 论文 / 规范

9.3.2 书

9.3.3 博客 / 文档

9.3.4 人物

9.3.5 方法

9.4 经典问题与经典案例

问题为什么重要最简答案
URL 要不要放动词统一接口可读性/orders/{id},动作只在无法建模时用 command 子资源
PUT 和 PATCH 怎么选重试和覆盖语义不同PUT 替换完整表示;PATCH 按媒体类型应用变更
401 还是 403客户端处理不同缺少/无效认证用 401;身份有效但无权用 403
409 还是 422冲突与字段错误不同状态冲突用 409;语法正确但语义校验失败可用 422
cursor 还是 offset大表写入时稳定性稳定排序键 + cursor;后台小表可 offset
如何防重复下单网络重试不可避免Idempotency-Key + 请求指纹 + 原子存储结果
如何并发更新防 lost updateETag + If-Match,不匹配回 412
版本放哪里影响缓存与路由团队一致即可;优先兼容演进,重大断裂再新 major
Webhook 如何可靠接收端会失败签名、事件 id、快速 2xx、重试、去重、死信
如何定位慢请求多层代理会切断上下文W3C trace context + request id + RED 指标

9.5 学习难点

9.6 技术标准与接口

9.6.1 Entity

名称版本组织状态 / 可访问性
OpenAPI Specification3.1OpenAPI Initiative正式;Apache-2.0 仓库,规范公开
JSON:API1.1JSON:API 社区正式;公开
JSON Schema2020-12JSON Schema / IETF 社区正式;公开
Problem Details for HTTP APIsRFC 7807IETF已被 RFC 9457 更新;RFC 公开
HALdraft-kelly-json-halIETF Internet-Draft / HAL 社区草案;公开

9.6.2 Scope

OpenAPI 描述 HTTP API;JSON Schema 描述数据约束;JSON:API 与 HAL 约定表示和链接;Problem Details 约定机器可读错误。它们不替代业务授权、事务设计或运行时保护。

9.6.3 Structure

OpenAPI 必会 pathsoperationsparametersrequestBodyresponsescomponentssecuritySchemes;JSON Schema 必会 typerequiredproperties、组合与引用;Problem Details 必会 type/title/status/detail/instance

9.6.4 Ecosystem

实现与工具包括 Swagger UI、Redoc、Spectral、OpenAPI Generator、Postman、Insomnia、Bruno、httpie、curl。API gateway 常用 Apigee、AWS API Gateway、Kong、Envoy。工具默认值不是规范。

9.6.5 Depth Tiers

层级可观察能力
L0知道这些标准解决什么问题
L1看懂 schema、operation 和 problem body
L2能正确编写、校验、生成客户端并调用
L3能解释语义、排错兼容/鉴权/缓存/限流问题
L4能设计扩展、治理规则与跨团队演进机制

本计划目标:L3

9.6.6 Source

10. 常见误区

11. 所有知识点分类(统一规则)

  1. 编程语言 2. 数据结构与算法 3. 计算机基础 4. 工程技术 5. Web 与后端 6. 前端与客户端 7. 数据与人工智能 8. 项目与职业能力 9. 安全与可靠性

本计划归属:Web 与后端 主 + 工程技术 辅。

直接依赖(3)

查看知识图谱 · 热度 🔥极高