REST vs GraphQL:有咩分別?邊種先至啱你用?
REST 同 GraphQL 係兩種設計 API 嘅方法,即你 App 嘅畫面(或者其他程式)向後端要求資料嘅約定方式。用 REST,每類東西都有一個獨立網址,例如 /customers 或 /orders,而且每個網址返回固定格式嘅資料。用 GraphQL,通常只有一個網址,呼叫者會傳送一個查詢,列明確切要返回邊啲欄位。對於大部分用 AI 建造嘅 App,REST 係較簡單、較好嘅預設選擇。
用 AI 建造時點解呢個重要
當你要求 AI 建立器製作「一個有後端嘅 App」,佢就要決定前端同後端點樣溝通。你唔需要每次都自己決定,但你會喺程式碼、文件同連接外部服務時見到呢啲名詞。有啲服務只提供一種風格:好多服務提供 REST API,而有啲服務(例如 Shopify 同 GitHub)則同時提供或者偏向用 GraphQL。明白兩者分別,可以幫你睇得明自己面對緊乜嘢,亦可以避免加入唔需要嘅複雜度。如果「API」對你嚟講係新嘢,可以先睇API 係乜嘢。
日常比喻
REST 好似餐廳嘅套餐。 每一道菜(端點)都按廚房設計好嘅形式上枱。你點「客戶」呢道菜,就會得到成個餐盤,包括名字、電郵、地址、註冊日期,即使你只想要個名字。如果你又想要客戶最近嘅訂單,就要再點另一道菜。
GraphQL 好似向一位侍應散叫單點。 你寫低確切想要乜嘢:「客戶嘅名字,以及佢最近三張訂單嘅日期同總額。」一次落單,一個餐盤,只會有你要求嘅嘢。不過,廚房必須預先設定好,先可以處理客人可能寫低嘅任何組合。
同一個請求,兩種做法
假設一個客戶頁面需要客戶嘅名字,加上佢最近三張訂單。
用 REST,通常要兩個請求:
GET /api/customers/42
GET /api/customers/42/orders?limit=3
第一個回應可能包括多過頁面所需嘅資料:
{ "id": 42, "name": "Lena Park", "email": "lena@example.com", "address": "…", "createdAt": "…" }
用 GraphQL,只需一個請求,通常係向單一端點(例如 /graphql)發送 POST,並附上一個查詢:
query {
customer(id: 42) {
name
orders(last: 3) {
date
total
}
}
}
回應會完全跟隨查詢嘅結構:
{
"data": {
"customer": {
"name": "Lena Park",
"orders": [
{ "date": "2026-09-20", "total": 48.0 },
{ "date": "2026-09-02", "total": 19.5 },
{ "date": "2026-08-15", "total": 72.25 }
]
}
}
}
兩者都會返回 JSON。分別在於由邊方決定資料格式:REST 由伺服器決定;GraphQL 則由呼叫者決定,但只限於伺服器嘅 schema 容許嘅範圍內。
並排比較
| REST | GraphQL | |
|---|---|---|
| 網址 | 多個,每種資源一個 | 通常一個(/graphql) |
| 邊方決定回應格式 | 伺服器 | 客戶端,透過查詢決定 |
| 讀取同寫入 | HTTP 方法:GET、POST、PATCH、DELETE | 查詢(讀取)同 mutation(寫入) |
| 攞取相關資料 | 通常要多個請求 | 通常一個請求 |
| 過量攞取(攞到唔需要嘅欄位) | 常見 | 設計上避免 |
| Schema/類型 | 可選(例如 OpenAPI 描述) | 必需,內置類型化 schema |
| HTTP 快取(瀏覽器、CDN) | 對 GET 請求較直接 | 較困難,通常由客戶端函式庫處理 |
| 錯誤處理 | HTTP 狀態碼(404、401、500) | 通常喺回應內容中有一個 errors 列表,而且經常同時返回狀態 200 |
| 保安同成本控制 | 按端點設定規則 | 亦需要限制查詢嘅深度同大小 |
| 學習曲線同工具 | 低;適用於任何 HTTP 工具 | 較高;需要 GraphQL 伺服器,通常亦要客戶端函式庫 |
各自適合用喺邊度
以下情況揀 REST:
- 你建造嘅係典型 App,例如預約系統、CRM、儀表板或者網店。
- 一個前端只同一個後端溝通,而且兩邊都由你控制。
- 你想要最容易除錯、快取同保安嘅方案。
- 其他服務會呼叫你嘅 App(webhook 同大部分整合都預期 REST 風格嘅端點)。
以下情況可以考慮 GraphQL:
- 多個唔同客戶端(網站、手機 App、合作夥伴整合)需要同一組資料嘅非常唔同部分。
- 你嘅資料有深層關聯(產品、款式、評價、賣家、存貨),而畫面需要以多種方式將其組合。
- 你使用嘅服務以 GraphQL 作為主要 API。
一個實用原則:如果你唔確定自己需唔需要 GraphQL,你大概暫時唔需要。日後加入會比移除容易。
重要名詞
| 名詞 | 意思 |
|---|---|
| 端點(Endpoint) | API 回應嘅一個特定網址。 |
| 資源(Resource) | API 管理嘅一類東西,例如預約、客戶。 |
| Schema | 對 GraphQL API 可以返回乜嘢嘅完整、類型化描述。 |
| 查詢/mutation | 在 GraphQL 中,分別係讀取資料嘅請求同修改資料嘅請求。 |
| Resolver | 伺服器端程式碼,負責為 GraphQL 每個欄位攞取資料。 |
| 過量攞取/攞取不足 | 攞到多過所需嘅資料/需要額外請求先攞到足夠資料。 |
| N+1 問題 | 攞取一個列表,再逐項攞取詳情,會令每個項目觸發一次資料庫查詢,係 GraphQL(同 REST)常見嘅效能陷阱。 |
| OpenAPI | 描述 REST API 端點同資料嘅標準方法。 |
常見誤解
- 「GraphQL 較新,所以較好。」 佢係為解決特定問題而設。對於一個只有單一前端嘅 App,佢往往會增加工作量,但帶來嘅好處不多。
- 「GraphQL 係資料庫。」 唔係。佢係 API 層;喺佢背後,伺服器仍然要由資料庫讀取資料。
- 「GraphQL 一定快啲。」 請求數目減少,喺慢速手機網絡上可能有幫助;但不設限嘅查詢可能會載入大量資料。效能取決於後端。
- 「REST 即係嚴格標準。」 實際上,「REST API」一般指資源網址加上 HTTP 方法同 JSON。好多優秀嘅 API 都會靈活處理正式規則。
- 「狀態 200 即係成功。」 用 GraphQL 時,要檢查
errors欄位;一個請求可能部分失敗,但仍然返回 200。
可以問 AI 建立器嘅問題
- 「除非有明確理由,否則用簡單嘅 REST API 同 JSON;如果你認為需要 GraphQL,請解釋原因。」
- 「列出每個端點、佢返回乜嘢,以及邊啲人被允許呼叫。」
- 「客戶頁面只返回該頁用到嘅欄位。」
- 「為列表端點加入分頁,避免一次返回過千行資料。」
- 「呢個服務只有 GraphQL API:由伺服器呼叫,將金鑰放喺機密資料入面,並且只請求我哋需要嘅欄位。」
- 「返回正確嘅 HTTP 狀態碼同 JSON 錯誤訊息。」
Mythex 中嘅 REST 同 GraphQL
Mythex 嘅文件包括一個建立 REST API 後端嘅範例,附有起始提示;後端可以喺 Node、Python(FastAPI)、C# 或 Java 上運行,與你嘅網頁 App 一齊使用。文件並無描述 GraphQL 範本,所以如果你想要,就要明確提出,並說明原因。呼叫第三方 GraphQL API 嘅方式,同呼叫其他外部服務一樣;可參考整合任何 API。相關閱讀:前端 vs 後端 同點樣建立 REST API。
常見問題
REST 同 GraphQL 最大嘅分別係乜?
REST API 有好多個網址,每種資源一個,而且每個網址返回固定格式嘅資料。GraphQL API 通常只有一個網址,客戶端會傳送一個查詢,準確列出需要邊啲欄位,所以一次請求就可以攞到相關聯嘅資料,並且符合畫面所需嘅格式。
GraphQL 係咪比 REST 好?
整體而言,兩者並無孰優孰劣。當好多唔同畫面或 App 需要複雜、互相關聯資料嘅不同部分時,GraphQL 會有幫助。REST 較容易建造、快取同保安,對大部分細型同中型 App 嚟講係較好嘅預設選擇。
GraphQL 係咪比 REST 快?
未必一定快。佢可以減少一個畫面發出嘅請求數目,但一條複雜嘅查詢喺伺服器上可能會好慢同好耗資源。速度主要取決於後端同資料庫點樣建立,而唔係 API 嘅風格。
一個 App 可唔可以同時用 REST 同 GraphQL?
可以。好多 App 會為自家前端提供 GraphQL API,同時用 REST 處理 webhook 同第三方整合;亦有啲 App 會由 REST 後端去呼叫其他公司嘅 GraphQL API。