REST vs GraphQL:差別在哪裡?該用哪一個?
REST 與 GraphQL 是兩種設計 API 的方式,也就是你的應用程式畫面(或其他程式)向後端請求資料時,所約定的做法。使用 REST 時,每種資料各有獨立的網址,例如 /customers 或 /orders,每個網址回傳固定格式的資料。使用 GraphQL 時,通常只有一個網址,呼叫端送出查詢,列出它想取回的確切欄位。對大多數用 AI 建構的應用程式來說,REST 是較簡單、也較好的預設選擇。
用 AI 建構時為什麼要懂這個
當你向 AI 建構工具要求「一個有後端的應用程式」時,它必須決定前端與後端如何溝通。你不需要每次都自己決定,但會在程式碼、文件以及連接外部服務時看到這些術語。有些服務只提供一種風格:許多服務提供 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 | 查詢(讀取)與變更(寫入) |
| 取得相關資料 | 通常需要多次請求 | 通常一次請求即可 |
| 過度取得(取得用不到的欄位) | 常見 | 從設計上避免 |
| Schema / 型別 | 可選(例如 OpenAPI 描述) | 必要,內建型別化的 schema |
| HTTP 快取(瀏覽器、CDN) | 對 GET 請求很直接 | 較困難,通常由用戶端函式庫處理 |
| 錯誤處理 | HTTP 狀態碼(404、401、500) | 通常在回應內容中有 errors 清單,且經常伴隨狀態碼 200 |
| 安全性與成本控制 | 依端點設定規則 | 還需要限制查詢的深度與大小 |
| 學習曲線與工具 | 低,可搭配任何 HTTP 工具 | 較高,需要 GraphQL 伺服器,通常還需要用戶端函式庫 |
各自適合的情境
以下情況選擇 REST:
- 你在建構一般應用程式:預約系統、CRM、儀表板、商店。
- 一個前端與一個後端溝通,而且兩端都由你掌控。
- 你希望除錯、快取與保護都最簡單。
- 其他服務會呼叫你的應用程式(Webhook 與大多數整合都預期 REST 風格的端點)。
以下情況可考慮 GraphQL:
- 幾個不同的用戶端(網站、行動應用程式、合作夥伴整合)需要同一份資料的不同部分,而且差異很大。
- 你的資料彼此高度相連(商品、規格變體、評論、賣家、庫存),畫面需要以多種方式組合這些資料。
- 你要使用的服務以 GraphQL 作為主要 API。
一個實用的原則:如果你不確定是否需要 GraphQL,那你大概還不需要。之後再加入比移除容易。
關鍵術語
| 術語 | 意義 |
|---|---|
| 端點(Endpoint) | API 會回應的特定網址。 |
| 資源(Resource) | API 所管理的一類事物,例如預約、客戶。 |
| Schema | GraphQL API 能回傳內容的完整、型別化描述。 |
| 查詢 / 變更(Query / mutation) | 在 GraphQL 中:讀取資料的請求/修改資料的請求。 |
| Resolver | 伺服器端的程式碼,負責為某個 GraphQL 欄位取得資料。 |
| 過度取得 / 取得不足(Over-fetching / under-fetching) | 取得超過所需的資料/為了取得足夠的資料而需要額外請求。 |
| N+1 問題 | 取得一份清單加上每個項目的詳細資料時,每個項目都會觸發一次資料庫查詢,這是經典的 GraphQL(與 REST)效能陷阱。 |
| OpenAPI | 描述 REST API 端點與資料的標準方式。 |
常見的誤解
- 「GraphQL 比較新,所以比較好。」 它是用來解決特定問題的。對於只有單一前端的單一應用程式,它通常只會增加工作,帶來的好處有限。
- 「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 中執行。文件中沒有 GraphQL 範本,因此如果你需要,請明確要求,並說明原因。呼叫第三方 GraphQL API 的方式與呼叫其他外部服務相同,請參閱整合任何 API。相關閱讀:前端與後端與如何建構 REST API。
常見問題
REST 和 GraphQL 最主要的差別是什麼?
REST API 有許多網址,每種資源各一個,而且每個網址回傳的資料格式固定。GraphQL API 通常只有一個網址,用戶端會送出查詢,精確指定需要哪些欄位,因此一次請求就能取得相關資料,並符合畫面所需的格式。
GraphQL 比 REST 好嗎?
整體來說兩者沒有絕對的好壞。當許多不同的畫面或應用程式需要複雜、彼此相連之資料的不同部分時,GraphQL 會有幫助。REST 則較容易建構、快取與保護,對大多數中小型應用程式來說是較好的預設選擇。
GraphQL 比 REST 快嗎?
不會自動變快。它可以減少畫面發出的請求數量,但一個複雜的查詢在伺服器上可能既慢又耗資源。速度主要取決於後端與資料庫的架構,而非 API 的風格。
一個應用程式可以同時使用 REST 和 GraphQL 嗎?
可以。許多應用程式會為自己的前端提供 GraphQL API,同時使用 REST 處理 Webhook 與第三方整合;或是由 REST 後端去呼叫其他公司的 GraphQL API。