什麼是 GraphQL?
GraphQL 是當今軟體技術中最大的流行語之一。但它究竟是什麼?是像 SQL 一樣的查詢語言嗎?是像 JVM 這樣的執行引擎?還是像 XML 這樣的規範?
如果你回答上面這些都是,那麼你是對的!GraphQL 是一種查詢語言的語法、是一種編程語言無關的執行引擎,也是一種不斷發展的規範。
讓我們深入了解一下 GraphQL 如何成為所有這些東西的,並了解一下人們為什麼對它感到興奮。
查詢語言
GraphQL 作為查詢語言似乎是合理的 —— 畢竟 「QL」 似乎重要到出現在名稱中。但是我們查詢什麼呢?看一個示例查詢請求和相應的響應可能會有所幫助。
以下的用戶查詢:
{
user(id: 4) {
name
email
phoneNumber
}
}
可能會返回下面的 JSON 結果:
{
"user": {
"name": "Zach Lendon"
「email」: 「zach@hydrate.io」
「phoneNumber」: 「867-5309」
}
}
想像一下,客戶端應用查詢用戶詳細信息、獲取結果,並使用它填充配置屏幕。作為查詢語言,GraphQL 的核心優勢之一是客戶端應用可以只請求它需要的數據,並期望以一致的方式返回這些數據。
那麼 GraphQL 響應返回的什麼呢?這就是執行引擎發揮的作用,通常是以 GraphQL 伺服器的形式出現。
執行引擎
![GraphQL execution engine](/data/attachment/album/202004/04/113038j66quegss79g86zh.png "GraphQL execution engine")
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 構建一些東西!
via: https://opensource.com/article/19/6/what-is-graphql
作者:Zach Lendon 選題:lujun9972 譯者:geekpi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive