项目简介
genqlient 是一个专为 Go 语言开发者设计的库,用于生成类型安全的代码以便于查询 GraphQL API。在开发过程中,它充分利用了 GraphQL 和 Go 两者都是强类型语言的特性,确保开发人员编写的代码在编译时即能验证查询的合法性,并正确使用结果,从而减少样板代码。
genqlient 提供的功能
-
编译时验证:genqlient 可以在代码编译阶段验证 GraphQL 查询是否有效,这意味着开发者不会再将无效的 GraphQL 查询部署到生产环境。
-
类型安全的响应对象:对于每一个查询,genqlient 生成对应的正确类型,使得解析后的响应可以正确地反序列化。也就是说开发者无需使用不确定类型
interface{}
。 -
生产就绪:genqlient 已在 Khan Academy 使用于生产环境中,支持全球范围内的数百万学习者和教师。
如何使用 genqlient
使用 genqlient 非常简单,开发者可以通过命令 go run github.com/Khan/genqlient
下载并运行。要设置一个项目以使用 genqlient,可以查阅“入门指南”或者查看项目中的“示例”。详细的文档也提供了进一步的指导。
贡献 genqlient
genqlient 欢迎社区贡献者的参与!开发者可以查看贡献指南,或者在 GitHub 上提出问题,参与项目的改进和完善。
为什么选择 genqlient
大多数常见的 Go 语言 GraphQL 客户端通常需要开发者编写如下形式的代码:
query := `query GetUser($id: ID!) { user(id: $id) { name } }`
variables := map[string]interface{}{"id": "123"}
var resp struct {
Me struct {
Name graphql.String
}
}
client.Query(ctx, query, &resp, variables)
fmt.Println(resp.Me.Name)
这样的代码虽然能工作,但存在一些问题:
-
虽然响应结构在 Go 层面是类型安全的,但无法在设计层面验证其符合预期的 GraphQL 模式。在代码执行之前,可能会因为字段名称错误或大小写问题而出错。
-
GraphQL 的变量部分没有类型安全性,可能会传递错误类型的值而不知直到运行时。
-
需要重复编写许多代码,或使用复杂的结构标签,甚至可能为了简化而放弃类型安全性。
对于小型应用来说,这些问题或许不难接受,但对于大型生产级工具,这些问题就显得不是那么理想。而 genqlient 正是为了填补这个空白而生。它自动根据查询生成经过模式验证的类型安全代码,使开发者只需专注于业务逻辑。