GraphQL 日漸成爲數據查詢的主流標準之一,整個生態圈也蓬勃發展。本文則由淺入深地詳細介紹基礎的 GraphQL 格式與關鍵字,有助於初學者對於 GraphQL 的使用造成體系認知。git
GraphQL 日漸成爲數據查詢的主流標準之一。天天都會產生許多圍繞這項技術發展的精彩討論和新工具。GraphQL最棒的特性就是提供了一個豐富語言集來描述獲取數據的API。可是用戶該如何描述這種查詢語言,以及GraphQL這項核心技術自己呢?let's talk!github
GraphQL specification解釋了幾乎全部出如今GraphQL查詢語言中的概念,可是這篇文檔實在是太長了,因此我準備在這篇博客中,藉助一些具體的栗子來闡述其中一些最重要的概念,來幫助你成爲GraphQL專家!至少在紙上談兵方面 : )數據庫
注! 這篇文章可不是GraphQL的入門讀物。首先,你應該通讀concepts on the graphql.org docs,而後經過Learn Apollo tutorial來學習使用GraphQL,最後當你想繼續深刻了解這項技術時,再回到這裏來吧!編程
你們一般會使用「查詢」來稱呼 GraphQL API 服務的一切。可是這樣稱呼會有太多東西混雜在一塊兒了。咱們可能會把咱們跪求服務端的一系列行爲稱爲一次查詢、一次修改或者一次訂閱,但我想「請求(request)」這個詞可能更加複合HTTP通訊的概念,下面咱們先來定義一些最基礎的概念:bash
爲了搞清楚GraphQL各類基本操做之間的區別,讓咱們先來看一個簡單的GraphQL請求體:服務器
這個請求體顯示了GraphQL的主要構建塊,它指定了你嘗試獲取的數據。網絡
爲了讓你以很是簡潔的形式定義一個GraphQL查詢,上面的栗子是GraphQL的一種很是簡單的形式。可是在GraphQL操做中三種可選的部分都沒有在上述栗子中使用。若是你不只僅是用GraphQL執行查詢操做,或是但願傳遞動態變量到GraphQL查詢中,你就須要利用到這些新的GraphQL特性。數據結構
這裏剛好有一個包含了全部可選部分的栗子:編程語言
變量使用特定的序列化協議(在目前的 GraphQL 服務實現中,一般是使用JSON )經過查詢文檔獨立傳輸。下面是一個變量對象在查詢文檔中的示例: 函數
這裏有一個在談及Graph的技術意義時很重要,卻不常被說起的核心概念——花括號之間的全部東西叫什麼?
*選擇集(selection set)*是一個會在GraphQL 文檔中常常出現的概念,它賦予了GraphQL遞歸的特性,容許你獲取嵌套形式的數據。Int
或者String
。當開始介紹片斷(fragments)以後,GraphQL 將變得更增強大。它帶來了一系列新的概念。
就像操做(operations)同樣,片斷也選擇集,使用起來也跟在操做(operations)中使用選擇集同樣。
片斷(fragments )只有在操做(operations)中使用才能發揮出做用。片斷是 GraphQL 的主要組合數據結構,經過片斷能夠重用重複的字段選擇,減小 query 中的重複內容。接下來咱們將介紹使用片斷(fragments )的兩種方式:
...
以後來表示片斷。例如沒有片斷時須要這樣編寫 query:query noFragments {
user(id: 4) {
friends(first: 10) {
id
name
profilePic(size: 50)
}
mutualFriends(first: 10) {
id
name
profilePic(size: 50)
}
}
}
複製代碼
query 中存在下列重複的選擇集合:
{
id
name
profilePic(size: 50)
}
複製代碼
能夠用片斷簡化爲:
query withFragments {
user(id: 4) {
friends(first: 10) {
...friendFields
}
mutualFriends(first: 10) {
...friendFields
}
}
}
fragment friendFields on User {
id
name
profilePic(size: 50)
}
複製代碼
使用片斷時須要加上 ... 操做符表示展開片斷內容,這稱爲片斷擴展運算符(fragment spread),它能夠用在任何選擇集(selection set)中,用以匹配片斷的類型條件。
指令是獨立於GraphQL server以外的一個附加功能。指令不會對結果的值產生影響,可是會影響哪些結果會被返回,也許還會影響這些結果是如何被執行的。指令能夠出如今查詢的任何地方,但在這篇文章中咱們只關注當前GrahpQL文檔所描述的skip(忽略)
和include(包括)
兩個指令。
include
指令表示只有在 if 參數爲 true 時才引入片斷表示的字段。skip
指令表示在 if 參數爲 true 時忽略片斷中的字段。GraphQL 是在應用層對業務數據模型的抽象,是對數據請求定製的 DSQL,它解除了接口和數據之間的綁定,對業務數據結構作了抽象和整理,業務邏輯中的數據依賴於底層數據庫結構,而且能夠由具體業務場景來定製,不一樣的業務場景只要基於一樣一套基礎業務數據模型就能夠獲得複用,在我看來,這纔是 GraphQL 帶來的最大改變和收益。 目前GitHub整站API已遷移GraphQL,淘寶也在生成環境有所實踐。
《IVWEB 技術週刊》 震撼上線了,關注公衆號:IVWEB社區,每週定時推送優質文章。