使用 Golang 和 MongoDB 构建 REST API - Gin-gonic 版本
具象状态转移 (REST) 是一种指导应用程序编程接口 (API) 设计和开发的架构模式。 REST API 已成为产品的服务器部分与其客户端之间的通信标准,以提高性能、可扩展性、简单性、可修改性、可见性、可移植性和可靠性。
这篇文章将讨论使用Gin-gonic框架和MongoDB使用 Golang 构建用户管理应用程序。在本教程结束时,我们将学习如何构建 Gin-gonic 应用程序、构建 REST API 并使用 MongoDB 持久化我们的数据。
Gin-gonic,俗称 Gin,是一个用 Golang 编写的 HTTP Web 框架,具有性能和生产力支持。 Gin 使用HttpRouter的自定义版本,这是一个轻量级、高性能的 HTTP 请求路由器,它在 API 路由中导航的速度比大多数框架都快。
MongoDB 是一个基于文档的数据库管理程序,用作关系数据库的替代方案。 MongoDB 支持处理大量分布式数据,并提供无缝存储或检索信息的选项。
您可以在这个存储库中找到完整的源代码。
先决条件
本文中的以下步骤需要 Golang 经验。使用 MongoDB 的经验不是必需的,但拥有它是很好的。
我们还将需要以下内容:
-
MongoDB 帐户到主机数据库。注册完全免费。
-
Postman或您选择的任何 API 测试应用程序
让我们编码
入门
首先,我们需要导航到所需的目录并在我们的终端中运行以下命令
mkdir gin-mongo-api && cd gin-mongo-api
进入全屏模式 退出全屏模式
此命令创建一个gin-mongo-api文件夹并导航到项目目录。
接下来,我们需要通过运行以下命令来初始化一个 Go 模块来管理项目依赖项:
go mod init gin-mongo-api
进入全屏模式 退出全屏模式
此命令将创建一个go.mod文件用于跟踪项目依赖关系。
我们继续安装所需的依赖项:
go get -u github.com/gin-gonic/gin go.mongodb.org/mongo-driver/mongo github.com/joho/godotenv github.com/go-playground/validator/v10
进入全屏模式 退出全屏模式
github.com/gin-gonic/gin是一个用于构建 Web 应用程序的框架。
go.mongodb.org/mongo-driver/mongo是连接 MongoDB 的驱动程序。
github.com/joho/godotenv是一个用于管理环境变量的库。
github.com/go-playground/validator/v10是一个用于验证结构和字段的库。
应用程序入口点
安装好项目依赖后,我们需要在根目录下创建main.go文件并添加以下代码片段:
上面的代码片段执行以下操作:
-
导入所需的依赖项。
-
使用
Default配置初始化 Gin 路由器。Default函数使用默认中间件(记录器和恢复)配置 Gin 路由器。 -
使用
Get函数路由到/路径和返回Hello from Gin-gonic & mongoDB的 JSON 的处理程序函数。 -
使用
Run函数将router附加到 http.Server 并开始在localhost:6000上侦听和服务 HTTP 请求。
接下来,我们可以通过在终端中运行以下命令来启动开发服务器来测试我们的应用程序。
go run main.go
进入全屏模式 退出全屏模式
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--Bg8LVv1C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments .dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_164045184129_Screenshot%2B2021-12-25%2Bat%2B17.35.40.png)
Golang中的模块化
为我们的项目提供良好的文件夹结构至关重要。良好的项目结构简化了我们在应用程序中处理依赖项的方式,并使我们和其他人更容易阅读我们的代码库。
为此,我们需要在项目目录中创建configs、controllers、models、responses和routes文件夹。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--zPjoYexz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper- attachments.dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_164051349834_Screenshot%2B2021-12-26%2Bat%2B10.18.46.png)
PS:Thego.sumfile 包含所有依赖校验和,由gotools 管理。我们不必担心。
configs用于模块化项目配置文件
controllers用于模块化应用程序逻辑。
models用于模块化数据和数据库逻辑。
responses用于模块化描述我们希望 API 给出的响应的文件。这将在以后变得更加清晰。
routes用于模块化 URL 模式和处理程序信息。
设置 MongoDB
完成后,我们需要登录或注册我们的MongoDB帐户。单击项目下拉菜单,然后单击 New Project 按钮。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--XcTSNMP9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments. dropbox.com/s_B58C50BB61437E91E681B5825981F54733906EC9A6070DFB4A21109C66F0E3FA_1637365380025_Screenshot%2B2021-11-20%2Bat%2B00.33.27.png)
输入golang-api作为项目名称,点击 Next,然后点击 Create Project..
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--Uune2Wsj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments .dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640511449262_Screenshot%2B2021-12-26%2Bat%2B10.35.59.png)
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--yGS_XE7h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments. dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640511449329_Screenshot%2B2021-12-26%2Bat%2B10.36.27.png)
点击建立数据库
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--o3Vw_2qG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox。 com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640511574285_Screenshot%2B2021-12-26%2Bat%2B10.38.59.png)
选择 Shared 作为数据库类型。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--n-gcwCkX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:// paper-attachments.dropbox.com/s_B58C50BB61437E91E681B5825981F54733906EC9A6070DFB4A21109C66F0E3FA_1637334670330_Screenshot%2B2021-11-19%2Bat%2B15.59.38.png)
单击 Create 以设置集群。这可能需要一些时间来设置。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--cwJDLYJx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments .dropbox.com/s_B58C50BB61437E91E681B5825981F54733906EC9A6070DFB4A21109C66F0E3FA_1637334961608_Screenshot%2B2021-11-19%2Bat%2B16.13.28.png)
接下来,我们需要创建一个用户来外部访问数据库,方法是输入用户名、密码,然后单击创建用户。我们还需要通过单击 Add My Current IP Address 按钮来添加我们的 IP 地址以安全地连接到数据库。然后点击 Finish and Close 保存更改。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--zP-GoZeH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper- attachments.dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640512109914_Screenshot%2B2021-12-26%2Bat%2B10.43.36.png)
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--JgYrk21O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments. dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640512118747_Screenshot%2B2021-12-26%2Bat%2B10.43.52.png)
保存更改后,我们应该会看到一个 Database Deployments 屏幕,如下所示:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--fRNiaxls--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments。 dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640512328028_Screenshot%2B2021-12-26%2Bat%2B10.51.34.png)
将我们的应用程序连接到 MongoDB
完成配置后,我们需要将我们的应用程序与创建的数据库连接起来。为此,请单击 Connect 按钮
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--yLXpDCQw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments .dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640512936968_Screenshot%2B2021-12-26%2Bat%2B10.51.34.png)
点击 Connect your application,将 Driver 更改为Go和 Version,如下所示。然后点击复制图标复制连接字符串。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--CKRof165--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments。 dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640513302462_Screenshot%2B2021-12-26%2Bat%2B11.03.40.png)
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--XsQ4KIjL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments .dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640513302542_Screenshot%2B2021-12-26%2Bat%2B11.04.29.png)
设置环境变量
接下来,我们必须使用我们之前创建的用户密码修改复制的连接字符串,并更改数据库名称。为此,首先,我们需要在根目录中创建一个.env文件,并在该文件中添加以下代码段:
MONGOURI=mongodb+srv://<YOUR USERNAME HERE>:<YOUR PASSWORD HERE>@cluster0.e5akf.mongodb.net/myFirstDatabese?retryWrites=true&w=majority
进入全屏模式 退出全屏模式
下面是正确填充的连接字符串示例:
MONGOURI=mongodb+srv://malomz:malomzPassword@cluster0.e5akf.mongodb.net/golangDB?retryWrites=true&w=majority
进入全屏模式 退出全屏模式
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--eraqhw92--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:// /paper-attachments.dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640514977875_Screenshot%2B2021-12-26%2Bat%2B11.36.06.png)
加载环境变量
完成后,我们需要创建一个辅助函数来使用我们之前安装的github.com/joho/godotenv库加载环境变量。为此,我们需要导航到configs文件夹,并在此文件夹中创建一个env.go文件并添加以下代码段:
上面的代码片段执行以下操作:
-
导入所需的依赖项。
-
创建一个
EnvMongoURI函数,检查环境变量是否正确加载并返回环境变量。
连接到 MongoDB
要从我们的应用程序连接到 MongoDB 数据库,首先我们需要导航到configs文件夹,并在此文件夹中创建一个setup.go文件并添加以下代码段:
上面的代码片段执行以下操作:
-
导入所需的依赖项。
-
创建一个
ConnectDB函数,首先将客户端配置为使用正确的 URI 并检查错误。其次,我们定义了尝试连接时要使用的 10 秒超时。第三,检查连接数据库时是否出错,如果连接时间超过10秒,则取消连接。最后,我们 ping 数据库以测试我们的连接并返回client实例。 -
创建
ConnectDB的DB变量实例。这在创建集合时会派上用场。 -
创建
GetCollection函数以检索并在数据库上创建collections。
接下来,我们需要在应用程序启动时连接到数据库。为此,我们需要修改main.go,如下所示:
设置 API 路由处理程序和响应类型
路由处理程序
完成后,我们需要在routes文件夹中创建一个user_route.go文件来管理我们应用程序中所有与用户相关的路由,如下所示:
接下来,我们需要将新创建的路由附加到main.go中的 http.Server 上,如下图所示:
响应类型
接下来,我们需要创建一个可重用的struct来描述我们 API 的响应。为此,导航到responses文件夹,并在此文件夹中创建一个user_response.go文件并添加以下代码段:
上面的代码片段创建了一个UserResponse结构体,它具有Status、Message和Data属性来表示 API 响应类型。
PS:json:"status"、json:"message"_ 和_json:"data"被称为结构标签。结构标签允许我们将元信息附加到相应的结构属性。换句话说,我们使用它们来重新格式化 API 返回的 JSON 响应。
最后,创建 REST API
接下来,我们需要一个模型来表示我们的应用程序数据。为此,我们需要导航到models文件夹,并在此文件夹中创建一个user_model.go文件并添加以下代码段:
上面的代码片段执行以下操作:
-
导入所需的依赖项。
-
创建具有所需属性的
User结构。我们将omitempty和validate:"required"添加到 struct 标记中,分别告诉 Gin-gonic 忽略空字段并使该字段成为必填字段。
创建用户端点
通过模型设置,我们现在可以创建一个函数来创建用户。为此,我们需要导航到controllers文件夹,并在此文件夹中创建一个user_controller.go文件并添加以下代码段:
上面的代码片段执行以下操作:
-
导入所需的依赖项。
-
创建
userCollection和validate变量以分别使用我们之前安装的github.com/go-playground/validator/v10库创建集合和验证模型。 -
创建一个返回 Gin-gonic 处理程序的
CreateUser函数。在返回的处理程序中,我们首先在将用户插入文档时定义了 10 秒的超时,使用验证器库验证请求正文和必填字段。我们使用之前创建的UserResponse结构返回了适当的消息和状态代码。其次,我们创建了一个newUser变量,使用userCollection.InsertOne函数插入它并检查是否有错误。最后,如果插入成功,我们会返回正确的响应。
接下来,我们需要使用路由 API URL 和相应的控制器更新user_routes.go,如下所示:
获取用户端点
要获取用户的详细信息,我们需要修改user_controller.go,如下所示:
上面的代码片段执行以下操作:
-
导入所需的依赖项。
-
创建一个返回 Gin-gonic 处理程序的
GetAUser函数。在返回的处理程序中,我们首先定义了在文档中查找用户时的 10 秒超时,一个userId变量从 URL 参数中获取用户的 id 和一个user变量。我们将userId从字符串转换为primitive.ObjectID类型,这是 MongoDB 使用的 BSON 类型。其次,我们使用userCollection.FindOne搜索用户,将objId作为过滤器传递,并使用Decode属性方法得到对应的对象。最后,我们返回解码后的响应。
接下来,我们需要使用路由 API URL 和相应的控制器更新user_routes.go,如下所示:
PS: 我们也将auserId作为参数传递给URL路径。指定的参数必须与我们在控制器中指定的相匹配。
编辑用户端点
要编辑用户,我们需要修改user_controller.go,如下所示:
上面的EditAUser函数与CreateUser函数做同样的事情。但是,我们包含一个update变量来获取更新的字段并使用userCollection.UpdateOne更新集合。最后,我们搜索更新的用户的详细信息并返回解码的响应。
接下来,我们需要使用路由 API URL 和相应的控制器更新user_routes.go,如下所示:
删除用户端点
要删除一个用户,我们需要修改user_controller.go,如下图:
DeleteAUser函数遵循前面的步骤,使用userCollection.DeleteOne删除匹配的记录。我们还检查了项目是否成功删除并返回了适当的响应。
接下来,我们需要使用路由 API URL 和相应的控制器更新user_routes.go,如下所示:
获取用户端点列表
要获取用户列表,我们需要修改user_controller.go,如下图:
GetAllUsers函数遵循前面的步骤,通过使用userCollection.Find获取用户列表。我们还使用Next属性方法优化读取重新调整的列表,以遍历返回的用户列表。
接下来,我们需要使用路由 API URL 和相应的控制器更新user_routes.go,如下所示:
完成用户_controller.go
完成用户_route.go
完成后,我们可以通过在终端中运行以下命令来启动开发服务器来测试我们的应用程序。
go run main.go
进入全屏模式 退出全屏模式
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--WH1lBkOB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments。 dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640566569640_Screenshot%2B2021-12-26%2Bat%2B16.17.02.png)
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--Kd5NFYMX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper- attachments.dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640692825871_Screenshot%2B2021-12-28%2Bat%2B12.59.51.png)
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--_dC1m6tz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper- attachments.dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640566665581_Screenshot%2B2021-12-26%2Bat%2B20.59.07.png)
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--w-N5xS4n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:// paper-attachments.dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640566698763_Screenshot%2B2021-12-27%2Bat%2B00.28.38.png)
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--QQCOJtbA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper- attachments.dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640566729703_Screenshot%2B2021-12-27%2Bat%2B00.49.33.png)
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--PnDA6MG9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper -attachments.dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640566748806_Screenshot%2B2021-12-27%2Bat%2B01.16.15.png)
[
的数据库](https://res.cloudinary.com/practicaldev/image/fetch/s--LUQg6jdC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper- attachments.dropbox.com/s_0E637C74C0D58C5FC3FBA1D21E2CF4F11E7592B7929DAE10790A9D12FE972D1D_1640609703212_Screenshot%2B2021-12-26%2Bat%2B19.39.22.png)
结论
这篇文章讨论了如何构建 Gin-gonic 应用程序、构建 REST API 以及使用 MongoDB 持久化我们的数据。
您可能会发现这些资源很有帮助:
-
杜松子酒
-
MongoDB Go 驱动程序
-
Go 验证器
-
Go 环境加载器
更多推荐
所有评论(0)