指南

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 容許嘅範圍內。

並排比較

RESTGraphQL
網址多個,每種資源一個通常一個(/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。

Mythex · Pricing · 用 AI 建造任何嘢 · 網站及應用程式範本 · Mythex 比較 · AI 應用程式開發詞彙表 · 免費 AI 應用程式開發工具 · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(台灣)