Why is GitHub using GraphQL?

GitHub chose GraphQL for our API v4 because it offers significantly more flexibility for our integrators. The ability to define precisely the data you want—and only the data you want—is a powerful advantage over the REST API v3 endpoints. GraphQL lets you replace multiple REST requests with a single call to fetch the data you specify.

For more details about why GitHub has moved to GraphQL, see the original announcement blog post.

背景

GraphQL 的核心是一套數(shù)據(jù)查詢語言的規(guī)范曼尊,是 Facebook 在2012年開發(fā)的酬诀,2015年開源,F(xiàn)acebook 內(nèi)部已經(jīng)廣泛應(yīng)用骆撇,用于替代 REST料滥。

GitHub 為什么選擇 GraphQL?這是很多用戶關(guān)心的問題艾船,Github 對此做了解釋葵腹。

REST 問題所在

首要問題就是擴(kuò)展性方面,隨著 API 的不斷發(fā)展屿岂,會(huì)變得越來越臃腫践宴。

REST API 的方式:服務(wù)端定義一系列的接口,客戶端調(diào)用自己需要的接口爷怀,獲取目標(biāo)數(shù)據(jù)進(jìn)行整合阻肩。

例如用戶接口,剛開始時(shí)运授,返回的信息會(huì)比較少烤惊,例如只有: id,name

后來用戶的信息增加了吁朦,就在用戶接口中返回更多的信息柒室,例如:id,name,age,city,addr,email,headimage,nick

但可能很多客戶端只是想獲取其中少部分信息逗宜,如: name,headimage雄右,卻必須得到所有的用戶信息空骚,然后從中提取自己想要的。這個(gè)情況會(huì)增加網(wǎng)絡(luò)傳輸量擂仍,并且不便于客戶端處理數(shù)據(jù)囤屹。

還有一個(gè)不方便的地方,就是客戶端在某個(gè)需求中逢渔,可能需要調(diào)用多個(gè)獨(dú)立的 API 才能獲取到足夠的數(shù)據(jù)肋坚。例如:客戶端要顯示一篇文章的內(nèi)容,同時(shí)要顯示評論肃廓、作者信息智厌,那么就可能需要調(diào)用文章接口、評論接口亿昏、用戶接口,這種方式非常不靈活档礁。

GitHub 還遇到其他一些 REST API 不好處理的問題角钩,例如:想要確保客戶端提供的參數(shù)的類型安全呻澜;想要從代碼生成文檔递礼;想要識(shí)別每個(gè)端點(diǎn)的 OAuth 請求范圍 ……

GraphQL 的優(yōu)勢

GraphQL 簡單來說就是:取哪些數(shù)據(jù)是由客戶端來決定。

在 REST 中羹幸,給哪些數(shù)據(jù)是服務(wù)端決定的脊髓,客戶端只能從中挑選,如果 A 接口中的數(shù)據(jù)不夠栅受,那就再請求 B 接口将硝,然后從他們返回的數(shù)據(jù)中挑出自己需要的。

在 GraphQL 中屏镊,客戶端直接對服務(wù)端說想要什么數(shù)據(jù)依疼,服務(wù)端負(fù)責(zé)精確的返回目標(biāo)數(shù)據(jù)。

例如而芥,你想要獲取用戶的幾個(gè)屬性信息律罢,你的 GraphQL 請求就是這樣的:

{
 viewer {
   login
   bio
   location
   isBountyHunter
 }
}

相應(yīng)的返回信息是這樣的:

{
 "data": {
   "viewer": {
     "login": "octocat",
     "bio": "I've been around the world, from London to the Bay.",
     "location": "San Francisco, CA",
     "isBountyHunter": true
   }
 }
}

你可以看到 JSON 響應(yīng)中的鍵和值與查詢字符串中的術(shù)語一致。

再看一個(gè)復(fù)雜的例子棍丐,例如你想知道你給多少個(gè)項(xiàng)目點(diǎn)亮過星星误辑、最初3個(gè)項(xiàng)目的名字、及他們stars歌逢、forks巾钉、watchers 、open issues 的總數(shù)秘案。

GraphQL 請求:

{
 viewer {
   login
   starredRepositories {
     totalCount
   }
   repositories(first: 3) {
     edges {
       node {
         name
         stargazers {
           totalCount
         }
         forks {
           totalCount
         }
         watchers {
           totalCount
         }
         issues(states:[OPEN]) {
           totalCount
         }
       }
     }
   }
 }
}

響應(yīng):

{  
 "data":{  
   "viewer":{  
     "login": "octocat",
     "starredRepositories": {
       "totalCount": 131
     },
     "repositories":{
       "edges":[
         {
           "node":{
             "name":"octokit.rb",
             "stargazers":{
               "totalCount": 17
             },
             "forks":{
               "totalCount": 3
             },
             "watchers":{
               "totalCount": 3
             },
             "issues": {
               "totalCount": 1
             }
           }
         },
         {  
           "node":{  
             "name":"octokit.objc",
             "stargazers":{
               "totalCount": 2
             },
             "forks":{
               "totalCount": 0
             },
             "watchers":{
               "totalCount": 1
             },
             "issues": {
               "totalCount": 10
             }
           }
         },
         {
           "node":{
             "name":"octokit.net",
             "stargazers":{
               "totalCount": 19
             },
             "forks":{
               "totalCount": 7
             },
             "watchers":{
               "totalCount": 3
             },
             "issues": {
               "totalCount": 4
             }
           }
         }
       ]
     }
   }
 }
}

你只發(fā)出了一個(gè)請求來獲取所需的所有數(shù)據(jù)睛琳。

GitHub GraphQL API 體驗(yàn)

網(wǎng)址:GitHub GraphQL API

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盒蟆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子师骗,更是在濱河造成了極大的恐慌历等,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辟癌,死亡現(xiàn)場離奇詭異寒屯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)黍少,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門寡夹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人厂置,你說我怎么就攤上這事菩掏。” “怎么了昵济?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵智绸,是天一觀的道長。 經(jīng)常有香客問我访忿,道長瞧栗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任海铆,我火速辦了婚禮迹恐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卧斟。我一直安慰自己殴边,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布珍语。 她就那樣靜靜地躺著找都,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廊酣。 梳的紋絲不亂的頭發(fā)上能耻,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機(jī)與錄音亡驰,去河邊找鬼会傲。 笑死售淡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播交排,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼男窟,長吁一口氣:“原來是場噩夢啊……” “哼噪猾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起磕秤,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捧韵,沒想到半個(gè)月后市咆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡再来,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年蒙兰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芒篷。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搜变,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出针炉,到底是詐尸還是另有隱情挠他,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布篡帕,位于F島的核電站殖侵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赂苗。R本人自食惡果不足惜愉耙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一贮尉、第九天 我趴在偏房一處隱蔽的房頂上張望拌滋。 院中可真熱鬧,春花似錦猜谚、人聲如沸败砂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昌犹。三九已至,卻和暖如春览芳,著一層夾襖步出監(jiān)牢的瞬間斜姥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工沧竟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铸敏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓悟泵,卻偏偏與公主長得像杈笔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子糕非,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

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