graphql簡(jiǎn)介

1. 什么是graphql

GraphQL 既是一種用于 API 的查詢語(yǔ)言也是一個(gè)滿足你數(shù)據(jù)查詢的運(yùn)行時(shí)雌团。直譯過來就是圖查詢語(yǔ)言棍厂,所以當(dāng)他在處理圖狀數(shù)據(jù)的時(shí)候棕孙,會(huì)有很大的優(yōu)勢(shì)。

2. graphql的優(yōu)勢(shì)

Ask for what you need 要什么點(diǎn)什么脖律,參數(shù)不多不少剛剛好
只需一次請(qǐng)求谢肾,獲取多個(gè)資源
API演進(jìn)過程,平滑無痕

3.舉個(gè)??

比如我們現(xiàn)在后端定義了一個(gè)用戶user模塊小泉,以及一個(gè)針對(duì)user模塊的查詢Query芦疏,代碼大概如下:

    type user {
      telephone: String
      QQ: String
      id: ID!
      name: String!
      age: Float
      hobby: [String]
    }
    type Query {
      userQuery(id: String!):  user!
    }

這里可以看出graphql中實(shí)體的參數(shù)都是有類型、以及是否可為空的校驗(yàn)微姊。
然后Query和Mutation是graphql里面定義的操作關(guān)鍵字酸茴,用來表示查詢請(qǐng)求以及更新請(qǐng)求,在單個(gè)請(qǐng)求的情況下兢交,兩者只有語(yǔ)義上的區(qū)別弊决,但是在多個(gè)資源同時(shí)在一次請(qǐng)求中發(fā)起時(shí),多個(gè)query會(huì)并行執(zhí)行魁淳,而Mutation則會(huì)根據(jù)順序依次執(zhí)行。
接下來我們?cè)購(gòu)那岸税l(fā)起一個(gè)請(qǐng)求与倡,查詢某個(gè)用戶的信息界逛,請(qǐng)求的參數(shù)形式大概如下

  query userQuery($id: String!) {
      user(id: $id) {
        name
        age
        telephone
      }
   }

這是一個(gè)針對(duì)用戶user實(shí)體的請(qǐng)求,并且告訴接口纺座,我只要知道name息拜、age、telephone這三個(gè)信息净响,那么這次的請(qǐng)求成功后少欺,接口就只會(huì)返回這三個(gè)參數(shù),不多也不少馋贤。

  {
    data: {
        user: {
          name: "張三",
          age: 18,
          telephone: "13012345678"
        }
    }
  }
接下來如果赞别,我們的接口要進(jìn)行演進(jìn),需要新增的寵物信息的數(shù)據(jù)配乓,寵物信息與用戶相關(guān)聯(lián)仿滔,但是單獨(dú)存放在另一個(gè)數(shù)據(jù)表中。那么只需要將schema聲明改成這樣:
      type user {
        telephone: String
        QQ: String
        id: ID!
        name: String!
        age: Float
        hobby: [String]
        pet: [pet]
      }
      type pet {
        name
        temper
        species
        age
        weight
      }
      type Query {
        userQuery(id: String!):  user!
      }

只需要新增一個(gè)寵物的實(shí)體定義犹芹,并且把它放在user實(shí)體的下面相關(guān)聯(lián)崎页。前端同時(shí)把需要查詢的寵物信息參數(shù),也加到請(qǐng)求中來腰埂,就可以請(qǐng)求得到寵物信息相關(guān)字段了飒焦。

  query userQuery($id: String!) {
      user(id: $id) {
        name
        age
        telephone
        pet {
          name
          species
        }
      }
   }

接口的升級(jí)過程也是非常的平滑,并且多個(gè)資源的查詢?cè)谝淮握?qǐng)求中就已經(jīng)完成了屿笼。同時(shí)之前只查詢用戶信息的情況也能繼續(xù)兼容牺荠,只需要在前端發(fā)起請(qǐng)求時(shí)去掉pet相關(guān)請(qǐng)求參數(shù)即可翁巍。
上面pet和user是有關(guān)聯(lián)關(guān)系的,如果有另一個(gè)與user無關(guān)聯(lián)的實(shí)體志电,也是可以合并到一次請(qǐng)求中查詢得到資源的:

  query userQuery($id: String!) {
      user(id: $id) {
        name
        age
        telephone
        pet {
          name
          species
        }
      }
      activity {
          id
          name
          createdTime
      }
   }

可以看到雖然graphql查詢的數(shù)據(jù)是圖狀結(jié)構(gòu)的曙咽,但是處理起來最后返回給前端的其實(shí)是樹狀結(jié)構(gòu)的數(shù)據(jù),每個(gè)查詢(query)或修改(mutation)返回的結(jié)構(gòu)始終有一個(gè)根節(jié)點(diǎn)挑辆,而且能看出節(jié)點(diǎn)之間由上而下的父子關(guān)系例朱。

vs restful API

restful API中使用GET、PUT鱼蝉、POST等http方法來約定對(duì)資源的操作動(dòng)作洒嗤,graphql使用自己Query、Mutation來定義操作魁亦,使用post方法發(fā)起http請(qǐng)求渔隶,將查詢參數(shù)語(yǔ)句放在body之中。
restful API可使用http狀態(tài)碼來表示接口的異常錯(cuò)誤洁奈,而graphql返回的http狀態(tài)碼始終是200间唉,只有將錯(cuò)誤信息錯(cuò)誤碼再次封裝放在返回體中。
restful API可以使用swagger等工具來展示接口文檔利术,graphql中數(shù)據(jù)結(jié)構(gòu)schema即是接口文檔呈野。
graphql不能使用http緩存,因?yàn)間raphql的請(qǐng)求通常是http post方法印叁。所以在graphql中要使用緩存被冒,只有在客戶端集成,不過一般的graphql客戶端包(比如Apollo)都已集成了緩存功能轮蜕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昨悼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子跃洛,更是在濱河造成了極大的恐慌率触,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汇竭,死亡現(xiàn)場(chǎng)離奇詭異闲延,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)韩玩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門垒玲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人找颓,你說我怎么就攤上這事合愈。” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵佛析,是天一觀的道長(zhǎng)益老。 經(jīng)常有香客問我,道長(zhǎng)寸莫,這世上最難降的妖魔是什么捺萌? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮膘茎,結(jié)果婚禮上桃纯,老公的妹妹穿的比我還像新娘。我一直安慰自己披坏,他們只是感情好态坦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棒拂,像睡著了一般伞梯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帚屉,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天谜诫,我揣著相機(jī)與錄音,去河邊找鬼攻旦。 笑死喻旷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敬特。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牺陶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伟阔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掰伸,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤皱炉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后狮鸭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體合搅,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年歧蕉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灾部。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惯退,死狀恐怖赌髓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤锁蠕,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布夷野,位于F島的核電站,受9級(jí)特大地震影響荣倾,放射性物質(zhì)發(fā)生泄漏悯搔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一舌仍、第九天 我趴在偏房一處隱蔽的房頂上張望妒貌。 院中可真熱鬧,春花似錦抡笼、人聲如沸苏揣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)平匈。三九已至,卻和暖如春藏古,著一層夾襖步出監(jiān)牢的瞬間增炭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工拧晕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隙姿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓厂捞,卻偏偏與公主長(zhǎng)得像输玷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子靡馁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355