json2graphql
json2graphql 是一個(gè)根據(jù) json 生成 GraphQL Schema 的工具纱烘。
可在 https://luojilab.github.io/json2graphql/ 在線體驗(yàn)其功能。
關(guān)于 GraphQL
GraphQL 是一個(gè)用于 API 的查詢語言祈餐,是一個(gè)使用基于類型系統(tǒng)來執(zhí)行查詢的服務(wù)端運(yùn)行時(shí)(類型系統(tǒng)由你的數(shù)據(jù)定義)擂啥。GraphQL 并沒有和任何特定數(shù)據(jù)庫或者存儲(chǔ)引擎綁定,而是依靠你現(xiàn)有的代碼和數(shù)據(jù)支撐帆阳。由于其強(qiáng)類型哺壶,返回結(jié)果可定制,自帶聚合功能等特性,由 facebook 開源后山宾,被 github 等各大廠廣泛使用至扰。
核心概念:
更多請(qǐng)參考 https://graphql.cn/
為什么選用 GraphQL
相比 REST API, GraphQL 提供了更高的靈活性。接口調(diào)用方能夠精確的定義其所需數(shù)據(jù)资锰,并通知服務(wù)方只返回這部分?jǐn)?shù)據(jù)敢课,該功能是 REST API 無法提供的。GraphQL 能夠使客戶端只進(jìn)行一次接口調(diào)用绷杜,即可獲取多個(gè) REST API 請(qǐng)求返回的數(shù)據(jù)直秆。這種數(shù)據(jù)聚合的能力,正是我們所需要的鞭盟。
json protobuf 與 GraphQL
由于 protobuf 和 GraphQL 都是強(qiáng)類型的圾结,所以可以直接從 protobuf 的 schema 生成 GraphQL Schema,因而才能有自動(dòng)聚合 grpc 服務(wù)生成 GraphQL 接口的框架 rejoiner。但同樣的方法不適用于 json齿诉,因?yàn)闃?biāo)準(zhǔn)的 json 并不包含 schema,單純根據(jù) json 文件無法確定知道每個(gè)字段的類型(因?yàn)橛锌罩狄吒澹约扒短椎那闆r)。因而目前無法實(shí)現(xiàn)類似 rejoiner for json 這樣的全自動(dòng)框架鹃两。
我們雖不能生成最終的 GraphQL Schema,但是基于對(duì) json 的解析和一些約定遗座,我們可以生成一個(gè) GraphQL Schema 的草稿,生成 Schema 的絕大部分內(nèi)容俊扳,并將有疑問的地方標(biāo)記出來途蒋。
json2graphql 就是一個(gè)用 golang 實(shí)現(xiàn)的 json 生成 schema 的工具。如果你不熟悉 golang,可以使用其在線版本 https://luojilab.github.io/json2graphql/
在從 REST API 遷移到 GraphQL 的過程中馋记,我們有很多接口會(huì)返回大量字段(幾十個(gè))号坡,如果完全手動(dòng)編寫這些 Schema,將是非常痛苦的梯醒,我們開發(fā) json2graphql 的初衷就是解決這個(gè)問題宽堆,大大縮短開發(fā)時(shí)間。
以下介紹該工具用法茸习。
Usage
go run main.go -h
NAME:
inspect - generate a graphql schema based on json
USAGE:
main [global options] command [command options] [arguments...]
DESCRIPTION:
inspect json and generate draft schema.graphql
COMMANDS:
inspect generate a graphql schema based on json
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--verbose, -v show logs
--input value, -i value the json filename
--output value, -o value the target filename to store generated schema
--help, -h show help
Example
go run main.go -i example.json