API 範式比較 (API Paradigms)
三種範式速覽
| 範式 | 傳輸格式 | 底層協定 | 面試預設 |
|---|---|---|---|
| REST | JSON | HTTP/1.1+ | ✅ 預設選擇 |
| GraphQL | JSON | HTTP/1.1+ | 有特定需求時 |
| gRPC | Protocol Buffers(二進位) | HTTP/2 | 內部微服務 |
REST:簡單且靈活
以**資源(resource)**為核心,用 HTTP 方法表達操作。
GET /users/{id} → 取得用戶
PUT /users/{id} → 更新用戶
POST /users → 建立用戶
GET /users/{id}/posts → 取得用戶的貼文
常見反模式
❌ /updateUser、/startGame(操作命名,非 RESTful)
✅ PUT /users/{id}、PATCH /games + {"status": "started"}
REST 用資源 + HTTP 動詞,不是在 URL 裡放動詞。
何時用:外部 API、幾乎所有情境的預設選擇。
GraphQL:彈性的資料獲取
解決的問題:前後端分屬不同團隊時的 over-fetching 和 under-fetching。
Over-fetching:API 回傳遠多於當前需要的資料
Under-fetching:一個頁面需要多個 API 請求才能拿到所有資料
GraphQL 讓客戶端精確指定需要的欄位和結構:
query {
users(limit: 10) {
id
username
profile { fullName avatar }
groups { id name }
}
}
何時用:
- 前端需要快速迭代、靈活調整資料結構
- 多個團隊對重疊資料進行廣泛查詢
面試建議
在固定需求的面試中,GraphQL 的優勢較不明顯(需求不像真實產品會一直移動)。
只在問題明顯聚焦於靈活性時才提出 GraphQL。
gRPC:高效能微服務通訊
使用 Protocol Buffers 定義嚴格綱要,生成二進位序列化:
message User { string id = 1; string name = 2; }
service UserService {
rpc GetUser (GetUserRequest) returns (GetUserResponse);
}
| 對比 | JSON | Protocol Buffers |
|---|---|---|
| 格式 | 文字(含綱要) | 二進位(標籤+可變長度) |
| 範例大小 | {"id":"123","name":"Terry"} = 40 bytes |
同等內容 ≈ 15 bytes |
| 解析速度 | 較慢 | 快(某些基準吞吐量高 10 倍) |
何時用:內部微服務間高效通訊、需要強型別 API 定義。
面試陷阱
不要過早跳到 gRPC。面試官想看你如何思考問題,在解決其他實質瓶頸前就優化協定選擇不是好做法。
策略:內部 API 用 gRPC,外部 API 用 REST。
選型決策流程
預設 REST
│
▼
前端需要靈活查詢且資料結構複雜?
│
Yes ──► GraphQL
│
No
│
▼
是內部微服務間通訊且效能瓶頸明確?
│
Yes ──► gRPC
│
No ──► 繼續用 REST
Related Notes
- 01-Networking/03-HTTP-and-HTTPS — REST/GraphQL/gRPC 都建立在 HTTP 上
- 01-Networking/05-Realtime-Protocols — 需要即時推送時的替代方案
- 01-Networking/06-Load-Balancing — L7 LB 可根據 URL/header 路由 API 請求
- 01-Networking/Practice-Networking