在 Golang 中使用 Schema-First 方法构建 GraphQL 服务器

在 Golang 中使用 Schema-First 方法构建 GraphQL 服务器

使用 CRUD 操作探索 Golang GraphQL 服务器

Photo by 侯赛因·纳斯尔 on 不飞溅

这是文章的 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 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/36238/25461410

posted @   哈哈哈来了啊啊啊  阅读(232)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示