GraphQL學(xué)習(xí)——查詢與變更

簡介

  • GraphQL是一個用于API的查詢語言捉兴,一個使用基于類型系統(tǒng)來執(zhí)行查詢的服務(wù)端運(yùn)行時
  • GraphQL未與任何特定數(shù)據(jù)庫尚粘,存儲引擎綁定庙睡,而是依靠現(xiàn)有代碼和數(shù)據(jù)支撐

查詢和變更

字段(Fields)

  • GraphQL關(guān)于請求對象上的特定字段
  • 查詢和查詢的結(jié)果擁有一致的數(shù)據(jù)結(jié)構(gòu)(很重要)
    • 客戶端得到想要的數(shù)據(jù)
    • 服務(wù)器準(zhǔn)確知道客戶端請求的字段
    • 可以對對象字段進(jìn)行次級選擇
// 查詢
{
  hero {
    name
    # 可以添加備注
    friends {
      name
    }
  }
}

// 結(jié)果
{
  "data" : {
    "hero": {
      "name": "wxy",
      "friends": [
        {
          "name": "Luke Skywalker"
        },
        {
          "name": "Han Solo"
        },
        {
          "name": "Leia Organa"
        }
      ]
    }
  }
}

參數(shù)(Arguments)

  • 每一個字段蹈矮,嵌套對象都能有自己的一組參數(shù)长已,使得GraphQL可以完美替代多次API獲取請求
  • 可以給標(biāo)量(scalar)字段傳遞參數(shù)畜眨,GraphQL自帶一套默認(rèn)類型,也可以自己定制類型术瓮,來序列化輸出格式
    Schema和類型
// 查詢
{
  human(id: "1000") {
    name
    height
  }
}

// 結(jié)果
{
  "data": {
    "human": {
      "name": "Luke Skywalker",
      "height": 1.72
    }
  }
}

別名(Aliases)

  • 通過別名胶果,查詢相同字段的不同內(nèi)容
// 查詢不同的hero
{
  empireHero: hero(episode: EMPIRE) {
    name
  }
  jediHero: hero(episode: JEDI) {
    name
  }
}

// 通過別名,查詢不同的hero
{
  "data": {
    "empireHero": {
      "name": "Luke Skywalker"
    },
    "jediHero": {
      "name": "R2-D2"
    }
  }
}

片段(Fragments)

  • GraphQL可復(fù)用單元斤斧,好的抽象早抠,可以避免重復(fù)代碼
{
  leftComparison: hero(episode: EMPIRE) {
    ...comparisonFields
  }
  rightComparison: hero(episode: JEDI) {
    ...comparisonFields
  }
}

fragment comparisonFields on Character {
  name
  appearsIn
  friends {
    name
  }
}

// 結(jié)果
{
  "data": {
    "leftComparison": {
      "name": "Luke Skywalker",
      "appearsIn": [
        "NEWHOPE",
        "EMPIRE",
        "JEDI"
      ],
      "friends": [
        {
          "name": "Han Solo"
        },
        {
          "name": "Leia Organa"
        },
        {
          "name": "C-3PO"
        },
        {
          "name": "R2-D2"
        }
      ]
    },
    "rightComparison": {
      "name": "R2-D2",
      "appearsIn": [
        "NEWHOPE",
        "EMPIRE",
        "JEDI"
      ],
      "friends": [
        {
          "name": "Luke Skywalker"
        },
        {
          "name": "Han Solo"
        },
        {
          "name": "Leia Organa"
        }
      ]
    }
  }

操作

一個操作query HeroNameAndFriends

  • 操作類型關(guān)鍵字——描述打算做什么類型的操作
    • query
    • mutation
    • subscription
  • 操作名稱HeroNameAndFriends
    • 想象成函數(shù)名,有利于追蹤和調(diào)試

變量(Variables)

  • 查詢參數(shù)可能是動態(tài)的撬讽,GraphQL擁有一級方法將動態(tài)值提取到查詢之外蕊连,然后作為分離的字典穿進(jìn)去悬垃。這些動態(tài)值,就是變量
  • 如何使用變量
    • 使用$variableName替代查詢中的靜態(tài)值
    • 聲明$variableName為查詢接收的變量之一
    • variableName: value通過傳輸轉(zhuǎn)用(通常是JSON)的分離的變量字典中甘苍。
  • 用法
// 聲明
query HeroNameAndFriends($episode: Episode) {
  hero(episode: $episode) {
    name
    friends {
      name
    }
  }
}
// 查詢
{
  "episode": "JEDI"
}
// 結(jié)果
{
  "data": {
    "hero": {
      "name": "R2-D2",
      "friends": [
        {
          "name": "Luke Skywalker"
        },
        {
          "name": "Han Solo"
        },
        {
          "name": "Leia Organa"
        }
      ]
    }
  }
}

變量使用注意事項

  • 變量前綴必須為$
  • 聲明變量后跟類型尝蠕,上例中是Episode
  • 所有聲明的變量都必須是:
    • 標(biāo)量
    • 枚舉值
    • 輸入對象類型(與服務(wù)器有關(guān))
  • 要傳遞一個復(fù)雜對象到一個字段上,必須知道服務(wù)器上匹配的類型载庭。
  • 變量定義允許:
    • 可選的
    • 必要的看彼,在類型后加!

變量默認(rèn)值

query HeroNameAndFriends($episode: Episode = "JEDI") {
  hero(episode: $episode) {
    name
    friends {
      name
    }
  }
}

指令(Directives)

  • 指令可以附著在字段或者片段包含的字段上,以服務(wù)單期待的方式改變查詢的執(zhí)行囚聚。
  • GraphQL核心規(guī)范的兩個指令:
    • @include(if: Boolean)僅在參數(shù)為true靖榕,包含被指令附著的字段
    • @skip(if: Boolean)如果參數(shù)為true,跳過被指令附著的字段

變更(Mutations)

  • 用來變更服務(wù)器數(shù)據(jù)的方法
  • 建議導(dǎo)致寫入的操作都應(yīng)該顯式的通過變更(mutation)來發(fā)送
  • 提價變更同時也可以查詢變更后的對象顽铸。
// 聲明變更
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
  createReview(episode: $ep, review: $review) {
    stars
    commentary
  }
}

// 操作
{
  "ep": "JEDI",
  "review": {
    "stars": 5,
    "commentary": "This is a great movie!"
  }
}

// 變更后查詢結(jié)果
{
  "data": {
    "createReview": {
      "stars": 5,
      "commentary": "This is a great movie!"
    }
  }
}

變更中的多個字段

  • 查詢字段茁计,是并行查詢
  • 變更字段,是線性執(zhí)行谓松,保證了變更不會出現(xiàn) 競爭的情況

內(nèi)聯(lián)片段(Inline Fragments)

  • GraphQL schema 具備自定義接口和聯(lián)合類型的能力
  • 若查詢的字段返回的是接口/聯(lián)合類型星压,就需要內(nèi)聯(lián)片段來去處下層具體類型的數(shù)據(jù)
//聲明
query HeroForEpisode($ep: Episode!) {
  hero(episode: $ep) {
    name
    ... on Droid {
      primaryFunction
    }
    ... on Human {
      height
    }
  }
}
// 操作
{
  "ep": "JEDI"
}
// 結(jié)果
{
  "data": {
    "hero": {
      "name": "R2-D2",
      "primaryFunction": "Astromech"
    }
  }
}

元字段(Meta fields)

  • GraphQL允許在查詢的任何位置請求__typename,一個元字段鬼譬,以獲得那個位置的對象
// 聲明
{
  search(text: "an") {
    __typename
    ... on Human {
      name
    }
    ... on Droid {
      name
    }
    ... on Starship {
      name
    }
  }
}

// 查詢結(jié)果
{
  "data": {
    "search": [
      {
        "__typename": "Human",
        "name": "Han Solo"
      },
      {
        "__typename": "Human",
        "name": "Leia Organa"
      },
      {
        "__typename": "Starship",
        "name": "TIE Advanced x1"
      }
    ]
  }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娜膘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子优质,更是在濱河造成了極大的恐慌竣贪,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盆赤,死亡現(xiàn)場離奇詭異贾富,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)牺六,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門颤枪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淑际,你說我怎么就攤上這事畏纲。” “怎么了春缕?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵盗胀,是天一觀的道長。 經(jīng)常有香客問我锄贼,道長票灰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮屑迂,結(jié)果婚禮上浸策,老公的妹妹穿的比我還像新娘。我一直安慰自己惹盼,他們只是感情好庸汗,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著手报,像睡著了一般蚯舱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掩蛤,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天枉昏,我揣著相機(jī)與錄音,去河邊找鬼盏档。 笑死凶掰,一個胖子當(dāng)著我的面吹牛燥爷,可吹牛的內(nèi)容都是我干的蜈亩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼前翎,長吁一口氣:“原來是場噩夢啊……” “哼稚配!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起港华,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤道川,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后立宜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冒萄,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年橙数,在試婚紗的時候發(fā)現(xiàn)自己被綠了尊流。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡灯帮,死狀恐怖崖技,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钟哥,我是刑警寧澤迎献,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站腻贰,受9級特大地震影響吁恍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一冀瓦、第九天 我趴在偏房一處隱蔽的房頂上張望鸦采。 院中可真熱鬧,春花似錦咕幻、人聲如沸渔伯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锣吼。三九已至,卻和暖如春蓝厌,著一層夾襖步出監(jiān)牢的瞬間玄叠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工拓提, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留读恃,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓代态,卻偏偏與公主長得像寺惫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蹦疑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,007評論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理西雀,服務(wù)發(fā)現(xiàn),斷路器歉摧,智...
    卡卡羅2017閱讀 134,707評論 18 139
  • 1. 簡介 1.1 什么是 MyBatis 艇肴? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,527評論 0 4
  • 五叁温、Java 虛擬機(jī) 一再悼、什么是Java虛擬機(jī)Java虛擬機(jī)是一個想象中的機(jī)器,在實際的計算機(jī)上通過軟件模擬來實現(xiàn)...
    壹點零閱讀 740評論 0 0
  • 如果生命是一條河 波濤和麟紋只是調(diào)劑 而沉于河底的淤泥才是本質(zhì) 那么你還會選擇做一條無奈的魚嗎 如果生活是一首歌 ...
    沙清閱讀 359評論 5 1