GraphQL 為什么火不起來(lái)?這么多年了
GraphQL 是啥?
官方介紹:GraphQL 既是一種用于 API 的查詢(xún)語(yǔ)言也是一個(gè)滿足你數(shù)據(jù)查詢(xún)的運(yùn)行時(shí)。GraphQL 對(duì)你的 API 中的數(shù)據(jù)提供了一套易于理解的完整描述,使得客戶(hù)端能夠準(zhǔn)確地獲得它需要的數(shù)據(jù),而且沒(méi)有任何冗余,也讓 API 更容易地隨著時(shí)間推移而演進(jìn),還能用于構(gòu)建強(qiáng)大的開(kāi)發(fā)者工具。
通俗點(diǎn)說(shuō)就是: 我們?cè)谑褂?Restful 風(fēng)格接口的時(shí)候,增刪改查可能會(huì)有四個(gè)接口,但是如果你用了 GraphQL 的話,可能就只需要一個(gè)接口,通過(guò)傳遞不同的模板參數(shù),去執(zhí)行不同的增刪改查操作。
你可以靈活地去調(diào)用 GraphQL 去獲取你自己想要的數(shù)據(jù)。
簡(jiǎn)單實(shí)踐
GraphQL 優(yōu)勢(shì)?
很多公司的后端使用了 GraphQL 來(lái)代替之前的 Restful 接口風(fēng)格,那么為啥呢?GraphQL 到底有什么優(yōu)勢(shì),值得這些公司去使用呢?
1.靈活
我們使用 Restful 的時(shí)候,大部分情況下一個(gè)接口只能返回一種數(shù)據(jù),如果你想要另一種數(shù)據(jù),那只能是重新再寫(xiě)一個(gè)接口。
但是在 GraphQL 中,返回什么樣的數(shù)據(jù),可以由調(diào)用方去決定,就比如剛剛實(shí)踐的例子,假如我傳了:
那么數(shù)據(jù)庫(kù)查詢(xún)會(huì)返回給我兩個(gè)字段的數(shù)據(jù):
如果你只需要一個(gè)字段,那么你可以傳:
那么數(shù)據(jù)庫(kù)查詢(xún)就只會(huì)返回給你一個(gè)字段:
2.精簡(jiǎn)
其實(shí)剛剛已經(jīng)舉過(guò)例子了,Restful 風(fēng)格下,增刪改查需要寫(xiě)四個(gè)接口,但是 GraphQL 可能只需要一個(gè)接口即可,大大減少了接口代碼。
3.統(tǒng)一
因?yàn)?GraphQL 查詢(xún)的入口大大減少,甚至可能一個(gè)項(xiàng)目只有一個(gè)查詢(xún)?nèi)肟冢越y(tǒng)一了查詢(xún)的規(guī)范。
GraphQL 局限性
1.學(xué)習(xí)成本
大部分前后端都習(xí)慣了 Restful 風(fēng)格,想要轉(zhuǎn) GraphQL 需要一定的學(xué)習(xí)成本,所以我們可以看到一般使用 GraphQL 的都是初創(chuàng)公司或者大公司,只有這些公司才有條件或者成本區(qū)做這件事。
2.建設(shè)成本
很多公司都一直是建設(shè) Restful 的基礎(chǔ)架構(gòu),如果想要轉(zhuǎn) GraphQL,那意味著可能需要改造現(xiàn)有的架構(gòu),這是需要時(shí)間成本和建設(shè)成本的。
3.雞肋?
說(shuō) GraphQL 好用吧,確實(shí)挺好用,但是說(shuō)非他不可吧,好像也不是。感覺(jué)就是還沒(méi)到非用他不可的地步。
4.安全性
正是因?yàn)?GraphQL 的靈活性開(kāi)放性,所以導(dǎo)致了他的安全系數(shù)大大降低。
調(diào)用方能靈活獲取數(shù)據(jù),那是萬(wàn)萬(wàn)不可的,因?yàn)橛幸恍┧矫軘?shù)據(jù)可不能給他們?nèi)カ@取~
可能還有遇到一些惡意用戶(hù),對(duì)你的數(shù)據(jù)進(jìn)行查詢(xún),進(jìn)而對(duì)你造成不利。
5.排隊(duì)?
只有一個(gè)查詢(xún)?nèi)肟诘脑挘侨绻芏嗾{(diào)用方同時(shí)調(diào)用的話,難道要排隊(duì)查詢(xún)嗎?這樣的話會(huì)不會(huì)查詢(xún)時(shí)長(zhǎng)會(huì)很久?