Drupal Headless CMS 之 GraphQL
之前我們講過Headless CMS✵✶✷✸✹✺✻✼❄❅,就是面向API的CMS系統⑰⑱⑲⑳⓪⓿❶❷❸❹❺,對于希望了解更多Headless CMS的朋友⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓,可以先看之前的文章:《 Headless CMS:以API為輸出的內容系統的構建 》①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯。
我們使用Drupal的時候☾☽❄☃,主要使用Rest API和JSON APIⓣⓤⓥⓦⓧⓨⓩ,那么為什么多了一個GraphQL呢❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣?
本文不做太多的技術講解☾☽❄☃,希望無代碼ⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉ,三言兩語能說清楚什么是GraphQL✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴,做個入門⒜⒝⒞⒟⒠⒡⒢⒣⒤。
GraphQL初次見面
GraphQL㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,看名字✵✶✷✸✹✺✻✼❄❅,由兩部分Graph+QL⒜⒝⒞⒟⒠⒡⒢⒣⒤,QL就是query language⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓,查詢語言㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂,Graph웃유ღ♋♂,就是圖⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾,表示關系⒜⒝⒞⒟⒠⒡⒢⒣⒤。
從面向對象的角度來說ⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙ,所有的數據其實都是實體①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯,實體間互相引用☾☽❄☃,就是關聯ⓚⓛⓜⓝⓞⓟⓠⓡⓢ,這樣就形成了一張網狀圖☾☽❄☃,這個就是Graph的含義⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾。
那么⑰⑱⑲⑳⓪⓿❶❷❸❹❺,總結就是關聯對象查詢語言⒜⒝⒞⒟⒠⒡⒢⒣⒤。(隨意起名ⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉ,用于理解)

GraphQL和SQL的關系
如果還是不太理解❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣,我們舉個簡單的例子☾☽❄☃,數據庫里面有存儲學生的表ⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉ,還有一個表存儲的是班級信息㈠㈡㈢㈣㈤㈥㈦,學生就屬于一個班級✺ϟ☇♤♧♡♢♠♣♥,跟班級之間有關聯❣❦❧♡۵。
GraphQL就是能處理這種查詢的一種語言✺ϟ☇♤♧♡♢♠♣♥。
對比SQL
其實GraphQL跟SQL基本一樣✺ϟ☇♤♧♡♢♠♣♥,這樣聽起來就容易理解一些✺ϟ☇♤♧♡♢♠♣♥,關系查詢語言ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ。
不過一個是面向API使用的⑰⑱⑲⑳⓪⓿❶❷❸❹❺,一個是面向數據庫使用的✵✶✷✸✹✺✻✼❄❅。
也就是說就是語法和使用環境不一樣⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓。
除此之外❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣,幾乎一樣♀☿☼☀☁☂☄。
對比Rest
上面㈠㈡㈢㈣㈤㈥㈦,我們了解了GraphQL其實一種語言①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯,Rest API我們了解①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯,其實是一種規范㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉。
Rest定義了 HTTP請求 GET干啥♦☜☞☝✍☚☛☟✌✽✾✿❁❃,POST干啥⑰⑱⑲⑳⓪⓿❶❷❸❹❺,UPDATE干啥ⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙ,DELETE干啥❣❦❧♡۵。
URL的格式應該是 /[resource]/id等URL大概長什么樣✺ϟ☇♤♧♡♢♠♣♥,這樣方便前端統一使用㈠㈡㈢㈣㈤㈥㈦。
GraphQL說㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,好了❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣,啥都不用定義♦☜☞☝✍☚☛☟✌✽✾✿❁❃,直接post過去我這個查詢語句㈠㈡㈢㈣㈤㈥㈦,結果就是你想要查詢的結果⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾。
那這樣ⓣⓤⓥⓦⓧⓨⓩ,GraphQL就只有一個api地址ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ,一般就是/graphql, post過去一個查詢語句☧☬☸✡♁✙♆。,、':∶;,就能返回你想要查詢的結果㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉。
哪一個簡單ⓚⓛⓜⓝⓞⓟⓠⓡⓢ,你自己體會⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓!
前后端架構
搞清楚了什么是GraphQL㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,也搞清楚了GraphQL怎么用✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴,那么我們前后端怎么設計✵✶✷✸✹✺✻✼❄❅。
后端✵✶✷✸✹✺✻✼❄❅,不管什么語言ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ,目前都有開源的GraphQL包❻❼❽❾❿⓫⓬⓭⓮⓯⓰,引用過來①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯,然后做一些custom的開發✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴,就可以用♀☿☼☀☁☂☄,不用直接從頭搞㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉。前端☈⊙☉℃℉❅,這個其實就是POST請求☾☽❄☃,返回JSON而已❣❦❧♡۵,所以❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣,所有框架都支持ⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉ,不需要特殊的開發☾☽❄☃,并且更加簡單友好⒜⒝⒞⒟⒠⒡⒢⒣⒤。

當然⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓,GraphQL支持嵌套✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴,關聯等多重查詢⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾,因此♀☿☼☀☁☂☄,才能稱作查詢語言(QL)㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,所以整體功能還是很強大☧☬☸✡♁✙♆。,、':∶;。最后⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓,GraphQL有時候也不一定是最好的ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ,比如查詢多重會導致效率低下☧☬☸✡♁✙♆。,、':∶;,或者要重構代碼之類㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂,總之我們要有挑選方案的判斷力ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ,不要陷入專業陷阱ⓣⓤⓥⓦⓧⓨⓩ,實用的才是最好的⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ。
最后①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯,關于CMS構建各種系統的建設♀☿☼☀☁☂☄,可以參考我們其他相關文章⑰⑱⑲⑳⓪⓿❶❷❸❹❺,
1❻❼❽❾❿⓫⓬⓭⓮⓯⓰、如何通過開源方案自建視頻課程平臺
2❣❦❧♡۵、在線視頻教育學習平臺介紹
3웃유ღ♋♂、構建英文網站應該用什么框架웃유ღ♋♂?
4☈⊙☉℃℉❅、常見的CMS平臺比較
5㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉、外貿網站如何實現網站多語言版本開發⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵❆❇❈❉❊†☨✞✝☥☦☓☩☯?