B09 · API 設計 詳細 ROADMAP
計畫文件,不會被 Quartz 渲染。
回主 roadmap → backend/ROADMAP.md
章節目標
API 是後端對外的面孔。設計好,前端 / 第三方 / 未來的自己都感謝;設計爛,每一個版本都要道歉。本章聚焦:REST / GraphQL / gRPC 三種風格深入、API 版本管理、錯誤碼設計、冪等性、Rate Limit、文件自動化、OpenAPI 生態。
🌱 基本介紹
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 01 | API 設計是什麼 | 01-what-is-api-design | 🌱 | API 作為契約;backward / forward compatibility;Richardson Maturity Model |
❓ 為什麼需要
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 02 | 為什麼糟糕的 API 會毀掉你的後端 | 02-why-api-design-matters | 🌱 | 每個 breaking change 都要通知前端、APP、第三方;版本管理失控;文件跟實作不一致 |
| 03 | 為什麼不是 GraphQL / gRPC 取代 REST | 03-why-rest-still-wins | 🌱 | 可被 curl / browser debug、CDN / cache 原生支援、人類可讀、開發者心智負擔最低 |
| 04 | 為什麼要強制 OpenAPI | 04-why-openapi-mandatory | 🌱 | SDK 自動生成、跟前端 / APP 的 type-safe contract、mock server、文件自動化 |
🕰️ 演進
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 05 | API 設計演進史 | 05-api-design-evolution | 🌱 | SOAP → REST → JSON-RPC → GraphQL(2015)→ gRPC → tRPC → REST + OpenAPI 復興(2020+) |
| 06 | OpenAPI 演進 | 06-openapi-evolution | 🌱 | Swagger 1.2 → OpenAPI 2.0(Swagger)→ 3.0 → 3.1(JSON Schema 對齊) |
🧠 知識型
F09-A REST 深入
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 07 | RESTful 基礎 | ⛔️ fundamentals/restful-api | 🌿 | 跨系列 |
| 08 | Richardson Maturity Model | 08-richardson-maturity-model | 🌱 | Level 0 → 1 → 2 → 3(HATEOAS);大多數 API 停在 Level 2 |
| 09 | RESTful URL 設計 | 09-restful-url-design | 🌱 | resource naming、nested resources、filter / sort / pagination 的 URL 風格 |
| 10 | HTTP method 語意 | 10-http-method-semantics | 🌱 | GET / POST / PUT / PATCH / DELETE;PUT vs PATCH(idempotent vs partial update) |
| 11 | Status Code 設計 | 11-status-code-design | 🌱 | 2xx / 3xx / 4xx / 5xx;為什麼 200 回 {"error": "..."} 是 anti-pattern |
F09-B GraphQL
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 12 | GraphQL 後端視角 | 12-graphql-backend-view | 🌱 | Schema / Resolver / DataLoader;跟 REST 的 trade-off |
| 13 | N+1 問題 / DataLoader | 13-graphql-n-plus-1 | 🌱 | 為什麼 GraphQL 天生 N+1;DataLoader batching / caching 對策 |
| 14 | GraphQL Subscriptions | 14-graphql-subscriptions | 🌱 | WebSocket / SSE 實作、scaling 挑戰 |
F09-C gRPC
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 15 | gRPC 服務設計 | 15-grpc-service-design | 🌱 | Protobuf service definition、4 種 streaming 的實戰場景 |
| 16 | gRPC 錯誤處理 | 16-grpc-error-handling | 🌱 | Status code、error detail、跟 REST status 對齊 |
| 17 | Protobuf schema 演進 | 17-protobuf-schema-evolution | 🌱 | field number 不能重用、reserved、backward compat 策略 |
F09-D API Versioning
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 18 | API Versioning 策略 | 18-api-versioning-strategies | 🌱 | URL path(/v1/)vs header(Accept: application/vnd.api.v1+json)vs query param;各自優缺 |
| 19 | Deprecation 流程 | 19-api-deprecation | 🌱 | Sunset header、文件通知、grace period、強制下線時機 |
F09-E 可靠性
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 20 | Idempotency(冪等性) | 20-idempotency | 🌱 | Idempotency-Key header、金流 POST 重複請求、server-side 怎麼存 key |
| 21 | Rate Limiting | 21-rate-limiting | 🌱 | Fixed window / Sliding window / Token Bucket / Leaky Bucket;Kong / CloudFlare / Redis 實作 |
| 22 | Retry 策略(伺服器視角) | 22-server-retry-strategy | 🌱 | 哪些 endpoint 該可重試、哪些必須冪等;Retry-After header |
| 23 | Circuit Breaker | 23-circuit-breaker | 🌱 | 保護下游服務、跟微服務通訊整合、Hystrix / Resilience4j |
F09-F 錯誤與回傳格式
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 24 | 錯誤碼設計 | 24-error-code-design | 🌱 | 機器可讀 vs 人類可讀、錯誤碼結構(domain:action:reason)、i18n |
| 25 | Problem Details(RFC 7807) | 25-rfc-7807-problem-details | 🌱 | 標準化錯誤格式、type / title / detail / instance;為什麼值得採用 |
| 26 | Envelope pattern | 26-envelope-pattern | 🌱 | {data: ..., meta: ..., error: null} vs 純 payload;各自 trade-off |
F09-G 文件與契約
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 27 | OpenAPI / Swagger | ⛔️ fundamentals/swagger | 🌿 | 跨系列 |
| 28 | API 設計完整指南 | ⛔️ system-design/03-api-design | 🌿 | 跨系列 |
| 29 | Proto Planning | ⛔️ system-design/05-proto-planning | 🌿 | 跨系列 |
| 30 | OpenAPI → 跨語言 SDK 自動生成 | 30-openapi-codegen-sdk | 🌱 | openapi-generator、Swagger Codegen、團隊 workflow |
F09-H 特殊協議
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 31 | WebSocket 實戰 | ⛔️ infra/23-websocket / micro-service/26-websocket-sse | 🌿 | 跨系列 |
| 32 | Server-Sent Events(後端實作) | 32-sse-backend-impl | 🌱 | FastAPI / Express / Spring 各語言 SSE 實作;AI chat streaming 案例 |
| 33 | Webhook 設計 | 33-webhook-design | 🌱 | Payload 設計、重試、HMAC 簽名、idempotency;參考 Stripe / GitHub |
F09-I API 文件化生態與 Governance
API 文件不只 Swagger UI。2026 的後端團隊要有完整的文件化 discipline。
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 34 | OpenAPI 工具鏈全景 | 34-openapi-toolchain | 🌱 | Swagger UI / Redoc / Stoplight / Scalar 對比;spec first vs code first;auto-generated 的來源(FastAPI / springdoc / Swashbuckle) |
| 35 | AsyncAPI:事件驅動文件標準 | 35-asyncapi | 🌱 | OpenAPI 不涵蓋 event / queue;AsyncAPI 3.0 的角色;跟 RabbitMQ / Kafka schema 整合 |
| 36 | API Governance 實作 | 36-api-governance | 🌱 | Spectral lint / Azure API Center / SwaggerHub;CI 自動檢查;team 共用 style guide |
| 37 | Spec Linting(Spectral)實戰 | 37-spectral-linting | 🌱 | 自訂 rule、CI 整合、常用 rule 範例(naming / versioning / security) |
| 38 | API Deprecation Policy | 38-api-deprecation-policy | 🌱 | Sunset header / 通知流程 / grace period;跟 consumer 協作機制 |
| 39 | API Portal 對外設計 | 39-api-portal | 🌱 | Public-facing developer portal;SDK 自動生成 + 文件 + changelog + sandbox;Stripe / Twilio 模板 |
| 40 | ADR(Architecture Decision Record)工具鏈 | 40-adr-toolchain | 🌱 | MADR / Log4brains / adr-tools;git-based ADR;跟 B08 #24 連動但聚焦工具 |
| 41 | Runbook 系統 | 41-runbook-system | 🌱 | On-call 必要文件;跟 alert 綁定;執行腳本化(ChatOps);template 設計 |
| 42 | Architecture Diagram-as-Code | 42-diagram-as-code | 🌱 | C4 model / D2 / Mermaid / PlantUML / Structurizr;避免 PowerPoint rot;版本控制 |
| 43 | Internal Docs Stack | 43-internal-docs-stack | 🌱 | Docusaurus / MkDocs / Starlight / Nextra / Backstage TechDocs;選型決策;跟 monorepo 整合 |
🔧 小實作注意事項
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 44 | 從 OpenAPI spec 起手設計 API | 44-openapi-first-design | 🌱 | design → spec → impl / SDK / mock;跟 code-first 比較 |
| 45 | API 契約測試(Pact) | 45-pact-contract-testing | 🌱 | consumer-driven contract、CI 整合 |
| 46 | 用 Postman / Bruno / HTTPie 管理 API collection | 46-api-collection-tools | 🌱 | 團隊共用、環境變數、CI 整合 |
💣 Anti-pattern
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 47 | API 設計 Anti-patterns | 47-api-design-antipatterns | 🌱 | GET 打 action(GET /deleteUser)、200 回 error body、URL 裡塞動詞、status code 隨便選、沒版本硬改 schema、錯誤訊息只給使用者不給 developer、pagination 用 offset 不用 cursor(大資料集爆) |
🧰 對應檢查工具
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 48 | API 品質工具 | 48-api-tooling | 🌱 | Spectral(OpenAPI lint)、Postman / Bruno、Schemathesis / Dredd(contract)、Stoplight、Redocly |
📎 補充
| # | 主題 | Slug | Stage | 大綱 |
|---|
| S01 | JSON:API 標準 | s01-jsonapi-spec | 🌱 | 統一的 JSON response format、relationships、sparse fieldset |
| S02 | HATEOAS 死了嗎 | s02-hateoas-dead | 🌱 | Roy Fielding 原旨、為什麼 99% API 不做、什麼場景還有價值 |
| S03 | 好的 API 設計怎麼看 | ⛔️ standards/03-good-api-design | 🌿 | 跨系列 |
| S04 | Billing / Metering Backend | s04-billing-metering | 🌱 | SaaS usage metering 設計、API 使用量計費、invoice 生成、按 user / tenant 分帳;Stripe Metered Billing / OpenMeter pattern |
| S05 | 金流整合 | s05-payment-integration | 🌱 | Stripe / 綠界 / TapPay;webhook 重試 / idempotency;對帳流程;PCI-DSS 基本認知 |
章節進度統計
- 知識主題:38 + 3 補充 = 41 項
- 🌿 growing:6(跨系列)
- 🌱 seed:35
跨系列連結
- →
fundamentals/restful-api、fundamentals/swagger
- →
system-design/03-api-design、system-design/05-proto-planning
- →
backend/network/ B02(API 協議層)
- →
backend/auth/ B10(API 認證)
- →
backend/framework/ B06(framework 的路由 / validation / error)
- →
infra/21-api-gateway、infra/23-websocket
- →
standards/03-good-api-design