GraphQL學(xué)習(xí):Github GraphQL API v4初探
查看GithubAPI的時(shí)候粥诫,發(fā)現(xiàn)github API升級(jí)成了V4,并且叫GraphQL API v4肃廓。不禁大吃一驚,這是個(gè)什么東東。
什么是GraphQL
GraphQL(Graph Query Language):GraphQL 是一個(gè)用于 API 的查詢語(yǔ)言容诬,是一個(gè)使用基于類型系統(tǒng)來(lái)執(zhí)行查詢的服務(wù)端運(yùn)行時(shí)(類型系統(tǒng)由你的數(shù)據(jù)定義)。
GraphQL是一門語(yǔ)言沿腰,專門用于API查詢览徒。可以類比到SQL颂龙,這種類型的語(yǔ)言學(xué)名叫DSL(domain-specific language)习蓬,譯作領(lǐng)域?qū)S谜Z(yǔ)言
為什么Github選用GraphQL呢?因?yàn)镚raphQL具有以下好處:
- 更大的靈活性
- 精確定義所需數(shù)據(jù)的能力(GraphQL擁有強(qiáng)類型)
- 僅僅會(huì)返回你需要的數(shù)據(jù)(避免數(shù)據(jù)冗余)
- GraphQL允許您通過(guò)一次調(diào)用替換多個(gè)REST請(qǐng)求以獲取指定的數(shù)據(jù)
放一張來(lái)自圖說(shuō)明下工作過(guò)程:
看起來(lái)與原本的REST API沒什么兩樣措嵌。
是的躲叼,大致的工作流程就是如此,不過(guò)GraphQL作為一門語(yǔ)言企巢,其中有許多的概念和語(yǔ)法押赊。但是我不想純粹做官方文檔的copyer,而是作為官方文檔的一個(gè)導(dǎo)學(xué)包斑,具體的概念和語(yǔ)法可以去
GraphQL中文網(wǎng)學(xué)習(xí)流礁。
相信你也不愛一下子看到超多陌生概念,我們還行邊用邊學(xué)吧
初探
github提供了GraphQL Explorer來(lái)輔助GraphQL學(xué)習(xí)
一個(gè)小小案例
打開GraphQL Explorer這里我們先來(lái)運(yùn)行下面的代碼:
query {
viewer {
login
}
}
這段代碼可以查詢你github的用戶名罗丰,注意神帅,請(qǐng)先登錄。
我運(yùn)行的結(jié)果:
{
"data": {
"viewer": {
"login": "smarxpan"
}
}
}
這里你可能會(huì)產(chǎn)生疑惑萌抵,為什么接口可以這樣請(qǐng)求找御,到底發(fā)生了什么魔法元镀?
打開抓包軟件,我們來(lái)抓個(gè)包看看霎桅。
上面的請(qǐng)求栖疑,實(shí)際上發(fā)送的內(nèi)容仍舊是個(gè)json:
{
"query": "query { \n viewer { \n login\n }\n}",
"variables": {}
}
這里沒有什么魔法,我們看到那段代碼的內(nèi)容作為query參數(shù)的值發(fā)送給了服務(wù)端滔驶,服務(wù)端按照語(yǔ)法對(duì)其進(jìn)行解析遇革,然后返回給我們需要的值。
小小案例的具體解釋
query {
viewer {
login
}
}
這一小段的第一句:query
GraphQL中有兩種操作:query和mutation揭糕。query代表查詢萝快,mutation是變更。查詢就是請(qǐng)求數(shù)據(jù)著角,而變更揪漩,對(duì)應(yīng)REST API的POST/PATCH/DELETE。
這兩種操作使用的請(qǐng)求方式均為post吏口,get請(qǐng)求在GraphQL不常用奄容。
query的結(jié)構(gòu)類似:
query {
JSON objects to return
}
其內(nèi)部定義的是要返回?cái)?shù)據(jù)的json結(jié)構(gòu)。
學(xué)習(xí)和使用指引
最佳的示例當(dāng)然是《Github GraphQL Guides》产徊,其中有示例昂勒、可運(yùn)行,里面的每段代碼都可點(diǎn)擊到explorer里運(yùn)行囚痴。
語(yǔ)法學(xué)習(xí)還是推薦GraphQL中文網(wǎng):《GraphQL 入門》
還有一篇博客我覺得特別棒叁怪,是Leetcode工作的一位大神的《阻礙你使用 GraphQL 的十個(gè)問(wèn)題》
而真正使用到工作中,當(dāng)然少不了庫(kù)的使用
目前主流的開發(fā)語(yǔ)言均有具體實(shí)現(xiàn)深滚,取決于你使用的是哪一種語(yǔ)言奕谭,選擇自己的開發(fā)庫(kù)用起來(lái)。
結(jié)語(yǔ)
新技術(shù)無(wú)疑是讓人興奮的痴荐,GraphQL確實(shí)解決了不少痛點(diǎn)血柳,如果項(xiàng)目沒什么歷史包袱可以搞一搞。Github作為世界上最大的同性交友網(wǎng)站生兆,其在API上使用該語(yǔ)言相信會(huì)帶動(dòng)業(yè)界的進(jìn)步难捌,學(xué)就完了。