Khan/genqlient

GitHub: Khan/genqlient

genqlient 是一个基于 GraphQL schema 自动生成类型安全 Go 代码的 GraphQL 客户端库,解决传统客户端查询字符串与响应类型无法在编译期校验的问题。

Stars: 1315 | Forks: 143

generated graphql client ⇒ genqlient [![Go Reference](https://pkg.go.dev/badge/github.com/Khan/genqlient.svg)](https://pkg.go.dev/github.com/Khan/genqlient) [![Test Status](https://static.pigsec.cn/wp-content/uploads/repos/cas/31/31c96a8fe552af584b5983afc39ddf2e71ca6806185aad0eda564c77331e5b3e.svg)](https://github.com/Khan/genqlient/actions) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](docs/CODE_OF_CONDUCT.md) [![GoReportcard](https://goreportcard.com/badge/github.com/Khan/genqlient?status.svg)](https://goreportcard.com/report/github.com/Khan/genqlient) # genqlient:一个真正的类型安全的 Go GraphQL 客户端 ## 什么是 genqlient? genqlient 是一个 Go 库,可以轻松生成类型安全的代码来查询 GraphQL API。它利用了 GraphQL 和 Go 都是强类型语言这一事实,在编译时确保你的代码正在执行有效的 GraphQL 查询并正确使用结果,且只需极少的样板代码。 genqlient 提供: - GraphQL 查询的编译时验证:再也不用发布无效的 GraphQL 查询了! - 类型安全的响应对象:genqlient 为每个查询生成正确的类型,因此你可以确信响应会被正确反序列化,并且永远不需要使用 `interface{}`。 - 生产就绪:genqlient 已在 Khan Academy 的生产环境中使用,为全球数百万的学习者和教师提供支持。 ## 如何使用 genqlient? 你可以通过常规方式下载并运行 genqlient:`go run github.com/Khan/genqlient`。要设置你的项目以使用 genqlient,请参阅[入门指南](docs/introduction.md)或[示例](example)。有关更完整的文档,请参阅[文档](docs)。 ## 为什么需要另一个 GraphQL 客户端? 大多数常见的 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) // Output: Luke Skywalker ``` 这段代码可以运行,但存在几个问题: - 虽然响应 struct 在 Go 层面上是类型安全的;但并没有任何机制来检查 schema 是否如你预期的那样。也许该字段叫 `fullName` 而不是 `name`;或者你大小写弄错了(因为 Go 和 GraphQL 有不同的命名规范);这些问题你直到运行时才会发现。 - GraphQL 变量根本就不是类型安全的;你可能传入了 `{"id": true}`,同样这也是直到运行时才会发现! - 你不得不把所有东西都写两遍,或者将查询隐藏在复杂的 struct tag 中,又或者放弃你现有的类型安全并求助于 `interface{}`。 这些问题在小型应用中不算什么大问题,但对于严肃的生产级工具来说并不理想。而且它们应该是完全可以避免的:GraphQL 和 Go 都是强类型语言;并且 GraphQL 服务器会以标准的、机器可读的格式暴露它们的 schema。我们应该能够简单地编写一个查询,然后让它自动根据 schema 进行验证,并转化为我们可以在代码中使用的 Go struct。事实上,在这方面已经有了很好的先例:[99designs/gqlgen](https://github.com/99designs/gqlgen) 是一个流行的生成类型的服务端库,并且 Apollo 有一个 [codegen 工具](https://www.apollographql.com/docs/devtools/cli/#supported-commands)可以为其他几种语言生成类似的客户端类型。(更多先例请参阅[设计说明](docs/design.md)。) genqlient 填补了这一空白:你只需指定查询,它就会生成经过 schema 验证的、类型安全的辅助函数来执行查询。
标签:API客户端, EVTX分析, Go, GraphQL, Ruby工具, 代码生成, 日志审计, 渗透测试工具, 类型安全