GraphQL 和 REST 有何區別?

GraphQL 和 REST 是設計用於在網際網路上交換資料的 API 的兩種不同方法。REST 可讓用戶端應用程式使用 HTTP 動詞 (網際網路的標準通訊協定) 與伺服器交換資料。另一方面,GraphQL 是一種 API 查詢語言,用於定義用戶端應用程式如何從遠端伺服器請求資料的規範。您可以在 API 呼叫中使用 GraphQL,而無需依賴伺服器端應用程式來定義要求。GraphQL 和 REST 都是我們大多數現代應用程式背後的強大技術。

閱讀有關 REST 的內容 »

閱讀有關 GraphQL 實作的內容 »

GraphQL 與 REST 之間有什麼相似之處?

GraphQL 和 REST 都是常用的 API 架構樣式,支援在用戶端-伺服器模型的不同服務或應用程式之間交換資料。

API 有助於存取資料和資料操作,如下所示:

  1. 用戶端將 API 請求傳送至伺服器上的一個端點或多個端點
  2. 伺服器提供包含資料、資料狀態或錯誤代碼的回應

REST 和 GraphQL 允許您透過 API,在單獨的應用程式、服務或模組上建立、修改、更新和刪除資料。 使用 REST 開發的 API 被稱為 RESTful APIREST API。那些使用 GraphQL 開發的只是 GraphQL API

前端和後端團隊使用這些 API 架構,來建立模組化且可存取的應用程式。使用 API 架構有助於保持系統安全、模組化和可擴展性。這也讓系統具有更高效能,並且更容易與其他系統整合。

接下來,我們討論 GraphQL 與 REST 之間的一些其他相似之處。

閱讀有關 API 的內容 »

架構

REST 和 GraphQL 都實作了多個常見的 API 架構原則。例如,以下是其共用的原則:

  • 兩者都為無狀態,因此伺服器不會在請求之間儲存回應歷史記錄
  • 兩者都使用用戶端-伺服器模型,因此,單一用戶端的請求會導致單一伺服器的回覆
  • 兩者都以 HTTP 為基礎,因為 HTTP 是基礎的通訊協議

以資源為基礎的設計

REST 和 GraphQL 都設計了圍繞資源進行的資料交換。資源是指用戶端可透過 API 存取和操作的任何資料或物件。每項資源自身都有不重複的識別符 (URI),以及一組用戶端可以在其上執行的操作 (HTTP 方法)。

例如,假設一個社交媒體 API,使用者可在其中建立和管理張貼。在以資源為基礎的 API 中,張貼將會是一項資源。它自身有不重複的識別符,例如,/posts/1234。它還具有一組操作,例如 GET,用於在 REST 中擷取張貼;或 query,用於在 GraphQL 中擷取張貼。

Data Exchange

REST 和 GraphQL 都支援類似的資料格式。

JSON 是所有語言、平台和系統都能理解的最常用的資料交換格式。伺服器將 JSON 資料傳回給用戶端。提供了其他資料格式,但較不常用,包括 XML 和 HTML。

同樣,REST 和 GraphQL 都支援快取。因此,用戶端和伺服器可以快取經常存取的資料,以提高通訊速度。

閱讀有關 JSON 的內容 »

語言與資料庫中立

GraphQL 和 REST API 都可以與任何資料庫結構和任何程式設計語言搭配使用,包括用戶端和伺服器端。這使其與任何應用程式高度互操作。

GraphQL 嘗試克服哪些 REST 限制?

GraphQL 出現於 2012 年,是為了回應新興社交媒體平台對速度的需求。開發人員發現,現有的 API 架構 (例如 REST) 過於冗長,且結構化無法有效地產生新聞摘要。

接下來,我們將討論其面臨的一些挑戰。

固定結構資料交換

REST API 要求用戶端請求遵循固定結構,以接收資源。這種剛性結構易於使用,但並非總是交換所需資料的最有效方法。

過度擷取和擷取不足

REST API 始終傳回整個資料集。例如,從 REST API 中的 person 物件,您會收到該人員的姓名、出生日期、地址和電話號碼。即使您只需要電話號碼,您也會獲得所有這些資料。

同樣,如果您想要知道某人的電話號碼和上次購買,則需要多個 REST API 請求。URL /person 會傳回電話號碼,而 URL /purchase 會傳回購買歷史記錄。

社交媒體開發人員必須編寫大量的程式碼,只是為了處理 API 請求,這會影響效能和使用者體驗。

GraphQL 做為以查詢為基礎的解決方案應運而生。查詢只能在一個 API 請求和回應交換中傳回確切的資料。

主要差異:GraphQL 與REST

REST API 是應用程式通訊的架構概念。另一方面,GraphQL 是一項規範、一種 API 查詢語言,以及工具集。GraphQL 使用 HTTP 在單一端點上運作。

此外,REST 開發更專注於製作新的 API。同時,GraphQL 的重點是 API 的效能與靈活性。

接下來,我們將介紹更多不同之處。

用戶端請求

以下是 REST 請求用於工作的內容: 

  • 確定動作的 HTTP 動詞
  • 識別要對其執行 HTTP 動詞的資源 URL
  • 如果您想要在現有伺服器端資源內建立或修改物件,則要剖析的參數和值

例如,您可以使用 GET 從資源中取得唯讀資料,使用 POST 來新增資源項目,或使用 PUT 來更新資源。

相較之下,以下是 GraphQL 請求使用的內容:

  • 取得唯讀資料的查詢
  • 修改資料的變動
  • 訂閱以接收事件型更新或串流資料更新

資料格式描述您希望伺服器傳回資料的方式,包括與伺服器端結構描述相符的物件和欄位。您還可以輸入新資料。在內部,GraphQL 將每個用戶端請求做為 POST HTTP 請求傳送。

傳送給用戶端的資料

在 REST 架構下,資料從伺服器指定的整個資源結構中的伺服器傳回給用戶端。下列範例顯示了 REST 和 GraphQL 中傳回的資料。

REST 中傳回的資料範例

在 REST 中,GET/POST 傳回下列內容︰

[

  {

    "id": 1,

    "title": "First Post",

    "content": "This is the content of the first post."

  },

  {

    "id": 2,

    "title": "Second Post",

    "content": "This is the content of the second post."

  },

  {

    "id": 3,

    "title": "Third Post",

    "content": "This is the content of the third post."

  }

]

GraphQL 中傳回的資料範例

當您使用 GraphQL 時,只會傳回用戶端給定結構中指定的資料。

GET /graphql?query{post(id: 1) {id title content}} returns only the first post:

{

  "data": {

    "posts": [

      {

        "id": "1",

        "title": "First Post",

        "content": "This is the content of the first post."

      },

]}}

伺服器端結構描述

GraphQL 使用伺服器端結構描述,來定義與 REST API 不同的資料和資料服務。

以 GraphQL 結構定義語言撰寫的結構描述包含下列詳細資訊:

  • 屬於每個物件的物件類型和欄位
  • 針對每個欄位定義操作的伺服器端解析程式函數

結構描述明確定義類型,以描述系統上所有可用的資料,以及用戶端如何存取或修改該資料。 

另一方面,REST API 不需要伺服器端結構描述。但是您可以選擇定義該結構描述,以實現有效的 API 設計、文件編製和用戶端開發。 

版本控制

隨著 API 的演進,其資料結構和操作可能會變更。針對不知道這些變更的用戶端,它可能會破壞其系統或引入未知的錯誤。

REST API 通常在 URL 中包括版本控制以解決此問題,例如 https://example.com/api/v1/person/12341。 但是,版本控制並非強制性,而且可能會導致錯誤。 

GraphQL 需要 API 向後相容性。因此,刪除的欄位會傳回錯誤訊息,或者那些具有已棄用標籤的欄位會傳回警告。

錯誤處理

GraphQL 是一種強類型 API 架構,這意味著它需要結構描述中有關資料、其結構和資料操作的詳細資訊。由於結構描述中的詳細資訊層級,系統可以自動識別請求錯誤並提供有用的錯誤訊息。 

REST API 是弱類型,您必須在周圍的程式碼中建置錯誤處理。例如,如果 PUT 請求數值剖析為文字而非整數,則系統不會自動識別錯誤。

何時使用 GraphQL 與REST

您可以互換使用 GraphQL 和 REST API。不過,在某些使用案例中,其中一種會更適合。

例如,如果您有以下考量,GraphQL 可能是更好的選擇:

  • 您的頻寬有限,並且想要儘量減少請求和回應數目
  • 您有多個資料來源,並且想要將其合併在一個端點
  • 您的用戶端請求差異很大,並且期望得到非常不同的回應

 

另一方面,如果您有以下考量,REST 可能是一個更好的選擇:

  • 您擁有較小的應用程式,且資料不太複雜
  • 您擁有的所有用戶端使用類似的資料和操作
  • 您對複雜的資料查詢沒有要求

 

您還可以使用 GraphQL API 和 REST API,針對不同的功能區域建置單一應用程式。

如何在相同的 API 上同時使用 GraphQL 和 REST

在不執行完整重寫的情況下,可將 RESTful API 升級至 GraphQL API。

以下是該程序的概述:

  1. 了解 RESTful API 的資料模型。若要執行此操作,請檢查每個 URL 資源中的資料形狀。
  2. 從資料模型寫入 GraphQL 結構描述。
  3. 判斷用戶端對資料執行了哪些作業,並將其納入結構描述。
  4. 在結構描述每個欄位的伺服器端程式碼中,建立解析程式函數。
  5. 使用解析程式和結構描述建立 GraphQL 伺服器。

在此之後,用戶端可以使用 GraphQL 或 REST 與您的 API 通訊。

閱讀有關如何建置 GraphQL 解析程式的內容 »

差異摘要:REST 與GraphQL

 

REST

GraphQL

這是什麼?

REST 是用於定義用戶端與伺服器之間的結構化資料交換的規則集。

GraphQL 是一種查詢語言、架構樣式和用於建立和操作 API 的工具集。

最適合

REST 適用於明確定義資源的簡單資料來源。

GraphQL 適用於大型、複雜且相互關聯的資料來源。

資料存取

REST 具有 URL 形式的多個端點來定義資源。

GraphQL 具有個單一的 URL 端點。

傳回的資料

REST 以伺服器定義的固定結構傳回資料。

GraphQL 以用戶端定義的彈性結構傳回資料。

資料結構化和定義的方式

REST 資料為弱式類型。因此,用戶端必須在傳回資料時,決定如何解譯格式化的資料。

GraphQL 資料為強式類型。因此,用戶端以預先決定且相互了解的格式接收資料。

錯誤檢查

使用 REST 時,用戶端必須檢查傳回的資料是否有效。

使用 GraphQL 時,結構描述結構通常會拒絕無效的請求。這會導致自動產生錯誤訊息。

AWS 如何支援您的 GraphQL 和 REST 需求?

Amazon Web Services (AWS) 可協助您建置和提供更好的受管 API。

AWS AppSync 會建立無伺服器 GraphQL 以及發佈訂閱-(發佈/訂閱) API。其透過單一端點簡化應用程式的開發,以便安全地查詢、更新或發佈資料。

使用 AWS AppSync,您可以建立允許用戶端執行下列操作的 API:

  • 透過單一網路呼叫與多個資料來源互動,例如 SQL、NoSQL、搜尋資料、REST 端點及微型服務
  • 自動在行動和 Web 應用程式與雲端之間同步資料
  • 在後端與連線用戶端之間廣播資料
  • 存取物聯網 (IoT) 資料,在行動或 Web 應用程式中建置即時儀表板

同樣,Amazon API Gateway 是一種全受管的服務,可讓您輕鬆地建立、發佈、維護、監控和保護任何規模的 API。

以下是您可透過使用 API Gateway 獲益的方法:

  • 為使用者提供 API 請求和回應的高速效能
  • 授權存取您的 API
  • 同時執行相同 API 的多個版本,快速重複執行、測試和發行新的版本
  • 監控有關 API 呼叫、資料延遲和錯誤率的效能指標和資訊

立即建立帳戶,開始使用 AWS 上的 GraphQL 和 REST。

與 AWS 搭配使用的後續步驟

開始使用 GraphQL 進行建置

了解如何在 AWS 上開始使用 GraphQL

進一步了解 
開始使用 REST 進行建置

了解如何在 AWS 上開始使用 REST

進一步了解