GraphQL 是一種查詢語言、一個執行引擎,也是一種規範,它讓開發人員重新思考如何構建用戶端和 API 應用。
GraphQL 是當今軟體技術中最大的流行語之一。但它究竟是什麼?是像 SQL 一樣的查詢語言嗎?是像 JVM 這樣的執行引擎?還是像 XML 這樣的規範?
如果你回答上面這些都是,那麼你是對的!GraphQL 是一種查詢語言的語法、是一種程式語言無關的執行引擎,也是一種不斷發展的規範。
讓我們深入了解一下 GraphQL 如何成為所有這些東西的,並了解一下人們為什麼對它感到興奮。
GraphQL 作為查詢語言似乎是合理的 —— 畢竟 “QL” 似乎重要到出現在名稱中。但是我們查詢什麼呢?看一個範例查詢請求和相應的響應可能會有所幫助。
以下的使用者查詢:
{ user(id: 4) { name email phoneNumber }}
可能會返回下面的 JSON 結果:
{ "user": { "name": "Zach Lendon" “email”: “[email protected]” “phoneNumber”: “867-5309” }}
想象一下,用戶端應用查詢使用者詳細資訊、獲取結果,並使用它填充設定螢幕。作為查詢語言,GraphQL 的核心優勢之一是用戶端應用可以只請求它需要的資料,並期望以一致的方式返回這些資料。
那麼 GraphQL 響應返回的什麼呢?這就是執行引擎發揮的作用,通常是以 GraphQL 伺服器的形式出現。
GraphQL 執行引擎負責處理 GraphQL 查詢並返回 JSON 響應。所有 GraphQL 伺服器由兩個核心元件組成,分別定義了執行引擎的結構和行為:模式和解析器。
GraphQL 模式是一種自定義型別語言,它公開哪些查詢既允許(有效),又由 GraphQL 伺服器實現處理。上面使用者範例查詢的模式可能如下所示:
type User { name: String email: String phoneNumber: String}type Query { user: User}
此模式定義了一個返回使用者的使用者查詢。用戶端可以通過使用者查詢請求使用者上的任何欄位,並且 GraphQL 伺服器將僅返回請求的欄位。通過使用強型別模式,GraphQL 伺服器可以根據定義的模式驗證傳入的查詢,以確保是有效的。
確定查詢有效後,就會由 GraphQL 伺服器的解析器處理。解析器函數支援每個 GraphQL 型別的每個欄位。我們的這個使用者查詢的範例解析器可能如下所示:
Query: { user(obj, args, context, info) { return context.db.loadUserById(args.id).then( userData => new User(userData) ) }}
雖然上面的例子是用 JavaScript 編寫的,但 GraphQL 伺服器可以用任意語言編寫。這是因為 GraphQL 也是也是一種規範!
GraphQL 規範定義了 GraphQL 實現必須遵循的功能和特性。作為一個在開放網路基金會的最終規範協定(OWFa 1.0)下提供的開放規範,技術社群可以審查 GraphQL 實現必須符合規範的要求,並幫助制定 GraphQL 的未來。
雖然該規範對 GraphQL 的語法,什麼是有效查詢以及模式的工作方式進行了非常具體的說明,但它沒有提供有關如何儲存資料或 GraphQL 伺服器應使用哪種程式語言實現的指導。這在軟體領域是非常強大的,也是相對獨特的。它允許以各種程式語言建立 GraphQL 伺服器,並且由於它們符合規範,因此用戶端會確切知道它們的工作方式。GraphQL 伺服器已經有多種語言實現,人們不僅可以期望像 JavaScript、Java和 C# 這樣的語言,還可以使用 Go、Elixir 和 Haskell 等。伺服器實現所使用的語言不會成為採用過程的障礙。它不僅存在多種語言實現,而且它們都是開源的。如果沒有你選擇的語言的實現,那麼可以自己實現。
GraphQL 是開源 API 領域中一個令人興奮的、相對較新的參與者。它將查詢語言、執行引擎與開源規範結合在一起,它定義了 GraphQL 實現的外觀和功能。
GraphQL 已經開始改變企業對構建用戶端和 API 應用的看法。通過將 GraphQL 作為技術棧的一部分,前端開發人員可以自由地查詢所需的資料,而後端開發人員可以將用戶端應用需求與後端系統架構分離。通常,公司在使用 GraphQL 的過程中,首先會在其現有的後端服務之上構建一個 GraphQL API “層”。這使得用戶端應用開始獲得他們所追求的效能和運營效率,同時使後端團隊有機會確定他們可能需要在 GraphQL 層後面的“幕後”進行哪些更改。通常,這些更改都是為了優化,這些優化有助於確保使用 GraphQL 的應用可以盡可能高效地執行。由於 GraphQL 提供了抽象性,因此系統團隊可以進行更改的同時繼續在其 GraphQL API 級別上遵守 GraphQL 的“合約”。
由於 GraphQL 相對較新,因此開發人員仍在尋找新穎而激動人心的方法來利用它構建更好的軟體解決方案。GraphQL 將如何改變你構建應用的方式,它是否對得起眾望所歸?只有一種方法可以找到答案 —— 用 GraphQL 構建一些東西!