在 Golang 中使用 Schema-First 方法构建 GraphQL 服务器
在 Golang 中使用 Schema-First 方法构建 GraphQL 服务器
使用 CRUD 操作探索 Golang GraphQL 服务器
这是文章的 Golang 版本—— 在 Python 中使用模式优先方法构建 GraphQL 服务器。
它在 Golang 中使用完全相同的模式实现。
模式优先方法意味着我们将首先使用 GraphQL 模式定义语言编写模式。在代码优先的方法中,我们将使用库 API 构建我们的模式。
我们将使用[ gqlgen](https://gqlgen.com/getting-started/)
作为我们的 Golang 架构优先 GraphQL 库。
项目概况
我们将构建处理 CRUD 操作的 GraphQL 服务器 书
在里面 书店
.
简单地说,我们将把这本书的信息存储在我们的数据库中。为了简化这个项目,我没有使用任何类型的数据库;我只是使用了一个内存存储,并更专注于 GraphQL 部分。
服务器操作
- 添加书籍
- 凭身份证取书
- 按类型列出书籍
- 列出所有书籍
- 更新本书
- 删除图书
构建 GraphQL 服务器
入门
- 让我们创建我们的项目目录。
- 初始化 Go 模块
去模组初始化<dirname>
.
gqlgen
- 通过以下方式获取我们的包裹
去 github.com/99designs/gqlgen
- 初始化 gqlgen
去运行 github.com/99designs/gqlgen init
- 跑
去整理一下
获取所需的软件包
Go module
gqlgen init
此时,我们可以看到graphql目录下的各种文件和文件夹。目录图是 gqlgen 在我们输入后生成的 在里面
命令。
模型/model_gen.go
— 这是一个文件,其结构由 gqlgen 生成并由模式文件定义 架构.graphqls
生成/生成.go
— 这是一个包含生成代码的文件,它为每个查询和突变注入上下文和中间件。
您不应该修改这些文件中的任何一个,因为它们将在我们更新架构并生成时被 gqlgen 修改。
图/resolver.go
— 是根图解析器类型。该文件不会重新生成。这是我们声明应用程序依赖项的文件,例如我们的数据库。
架构.graphqls
— 是一个定义类型、查询和突变的 GraphQL 模式文件。模式文件使用模式定义语言 (SDL) 以人类可读的方式描述数据类型和操作(查询/突变)。
schema.resolvers.go
— 是一个 Go 文件,其中定义了查询和突变的包装代码 架构.graphqls
定义我们的模式
我邀请您以自己的方式和要求定义架构并实现代码。
- 删除文件内容
图/schema.graphqls
(由 gqlgen 生成) - 删除示例代码
schema.resolvers.go
- 继续定义我们自己的模式
图/schema.graphqls
我计划有一些 GraphQL 对象类型,可以保存一些关于 图书
在我们的 书店
.
这里我有两种对象类型和一种枚举类型来描述一个 书
.
书
类型具有以下字段:
标题
— 字符串类型且不可为空book_id
— 身份证类型类型
— 枚举类型作者
— 数组作者
类型和不可为空
作者
类型:
姓名
— 字符串类型且不可为空邮件
— 字符串类型
书籍类型
枚举类型:
- 有两个值(
小说
,非小说类
)
以上类型是处理的基本类型 图书
信息。
现在我们继续为我们的 GraphQL 服务定义入口点。
查询类型
我有以上 询问
具有以下三个字段的类型:
-
书
— 通过提供book_id
在论据中 -
图书
— 获取可用书籍的列表 -
获取手册
— 获取请求类型的书籍列表。这获取类型
参数是可选的。它的默认值为小说
.类型 GetBookResult{
存在 : 布尔值!
书 : 书
}
这 获取图书结果
类型有两个字段:
存在
— 布尔类型且不可为空。他们告诉给定的书籍信息是否存在book_id
书
— 书籍类型
突变类型
突变类型具有三个字段:
add_book
— 通过提供输入在我们的书店中创建图书资源,响应是请求的状态。更新书
— 更新现有图书信息,响应为请求状态。删除书
— 删除具有给定图书 ID 的图书并返回操作状态。
以上类型用于 add_book
突变类型的字段。
这 更新输入
和 放置状态
类型用于 更新书
的领域 突变
类型。
输入删除状态{
_错误_ : 布尔值!
_描述_ : 细绳
}
删除状态
类型用于 删除书
的领域 突变
类型。
我们到了 Schema 定义的结尾。
产生
一旦我们完成了我们的模式,我们需要使用生成 gqlgen 文件 去运行 github.com/99designs/gqlgen 生成
.这是它创建的所有命令:
missing go.sum entry and resolution
在运行此命令时,如果您遇到诸如缺少 go.sum 条目之类的错误,则将这些包添加到 go.sum 中。大多
_去 github.com/99designs/gqlgen_
这将解决错误。然后执行生成命令。
至此,我们已经为我们的模式生成了 Go 文件。继续实施我们的解析器。
GraphQL 服务器实现
内存存储
正如我所提到的,我将使用内存中的数据存储(只是一个变量)来存储书籍的信息。
初始化我们的 书店
变量在 解析器.go
.
来看看里面的内容 解析器.go
文件:
封装图 // 此文件不会自动重新生成。
//
// 它作为你的应用程序的依赖注入,在这里添加你需要的任何依赖。 类型解析器结构{}
现在,让我们添加我们的 书店
(清单 图书
) 到 解析器
结构。
一切就绪,除了解析器实现。
解析器实现
当我们打开文件时, 图/schema.resolvers.go
,我们可以看到最初的样板代码 产生
通过 gqlgen 生成命令。
我们必须修改我们的解析器方法来执行我们的要求。
修改方法包括:
添加书
更新书
删除书
书
图书
获取手册
基本上什么都有!
添加书
在我们实施我们的 添加书
方法,我们需要一个逻辑来生成唯一的 Book ID。
这是我在添加新书时查找下一本书 ID 的实现:
现在,我们的 添加书
的方法实现:
addbook method implementation
更新书
要更新现有图书,请执行以下操作:
删除书
从 书店
,这里是代码:
书籍,书籍,Getbooks
要按 ID 获取书籍、按类型获取书籍列表或获取所有书籍,方法如下:
完整的解析器代码
现在我们的实现已经很好了,让我们继续为客户服务。
服务客户
通过以下方式启动服务器 去运行 server.go
.
server.go 是初始化 gqlgen 项目时生成的 Go 文件。这个 server.go 将指向我们的 Query 和 Mutations 的解析器。
go run server.go
突变添加簿
查询书
突变更新书
查询书籍
查询 GetBook
突变删除书
我们可以使用任何 GraphQL 客户端来访问该服务。
概括
在本文中,我们看到了如何使用 gqlgen 库(模式优先方法)在 Golang 中构建我们自己的 GraphQL 服务器。
你可以在我的网站上找到这个项目 GitHub .谢谢阅读。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通