如何使用Go语言构建API服务器 - 第二部分:简单数据库

作者:API传播员 · 2026-01-15 · 阅读时间:6分钟

让我们开始学习如何在 Go 应用程序中构建JSON 数据库(Golang Scrible)来设置项目数据层,适合初学者学习。未来的文章中,我们将逐步替换为更标准的数据库。


系列文章目录

  1. 如何在 Go 中构建 API 服务器 – 第 1 部分:基本服务器
  2. 如何在 Go 中构建 API 服务器 – 第 2 部分:简单数据库
  3. 如何在 Go 中构建 API 服务器 – 第 3 部分:Postgres 数据库
  4. 如何在 Go 中构建 API 服务器 – 第 4 部分:访问控制

新项目结构

在本节中,我们将为项目引入三个新包:存储库(repository)数据库(db)模型(models)。以下是它们的功能说明:

  • db:负责加载和管理我们使用的数据库。
  • models:包含所有用于表示数据的结构体。在本例中,我们将创建一个用于用户的模型(User),并为需要在存储库中实现的方法提供接口。
  • repository:实现 models 包中的结构体和方法。

数据层的实现

创建 db.go

首先,我们需要在项目中实现 db.go 文件,用于处理数据库的加载和初始化。

创建 user.go

接下来,在 models 包中创建一个 user.go 文件,用于定义用户模型。为了便于复用,我们将该文件放置在 pkg 文件夹中。如果您不熟悉 pkg 的作用,可以参考相关资料。

实现 repositories

repositories 包将负责存储结构体及其接口实现。一旦一个结构体实现了接口的所有方法,就可以通过接口调用这些方法,从而简化测试流程。

更新 main.go

main.go 文件中添加新的代码逻辑,您可以通过 NEW 注释快速定位更改的部分。


用户 API 端点的实现

为了更好地使用数据库,我们将在本节中实现用户 API 端点。以下是需要注意的几点:

  1. Content-Type 限制API 端点仅接受 application/json 格式的数据。这样可以利用 Go 标准库中的 encoding/json 包进行编码和解码。
  2. 数据格式存储:将请求和响应的数据格式定义在 models 包中。

密码处理

创建一个 password.go 文件,用于处理用户密码的哈希操作。

使用编码和解码函数

以下是 user.go 文件的部分代码示例:

json.NewDecoder(req.Body).Decode(&userStruct)
json.NewEncoder(resp.Body).Encode(userStruct)

需要注意:

  • json.NewDecoderDecode 方法用于将请求的字节流解码为结构体。
  • json.NewEncoderEncode 方法用于将结构体编码为字节流并返回响应。

用户注册与登录

注册用户

启动服务器后,运行以下命令以测试用户注册功能:

$ http post 127.0.0.1:5000/api/v1/users name="John Doe" email="john@example.com" password="password123"

成功注册时,您将看到以下输出:

{
  "message": "User registered successfully"
}

注册失败

如果尝试重复注册相同的用户,系统将返回验证错误。

用户登录

登录失败:邮箱不存在

运行以下命令测试邮箱不存在的情况:

$ http post 127.0.0.1:5000/api/v1/login email="nonexistent@example.com" password="password123"

输出如下:

{
  "error": "Email not found"
}

登录失败:密码错误

测试无效密码的情况:

$ http post 127.0.0.1:5000/api/v1/login email="john@example.com" password="wrongpassword"

输出如下:

{
  "error": "Invalid password"
}

登录成功

最后,测试成功登录的场景:

$ http post 127.0.0.1:5000/api/v1/login email="john@example.com" password="password123"

输出如下:

{
  "message": "Login successful"
}

时间序列数据的实现

数据层

models 包中创建 tsd.go 文件,用于定义时间序列数据的结构体。

存储库层

repository 包中实现 tsd.go 文件,用于处理时间序列数据的存储逻辑。

应用层

更新 controller.go 文件以支持时间序列数据的操作。

主程序更新

最后,更新 main.go 文件以集成时间序列数据的功能。


API 调用示例

创建数据

运行以下命令创建时间序列数据:

$ http post 127.0.0.1:5000/api/v1/timeseries data="sample data"

成功时,输出如下:

{
  "message": "Time series data created successfully"
}

列出数据

运行以下命令列出所有时间序列数据:

$ http get 127.0.0.1:5000/api/v1/timeseries

检索数据

运行以下命令检索特定时间序列数据:

$ http get 127.0.0.1:5000/api/v1/timeseries/{id}

删除数据

运行以下命令删除时间序列数据:

$ http delete 127.0.0.1:5000/api/v1/timeseries/{id}

后续思考

在本篇文章中,我们使用简单的 JSON 数据库实现了数据层的基本功能。在接下来的文章中,我们将探讨以下问题:

  • 如何将代码迁移到真实的数据库(如 Postgres)。
  • 如何处理会话管理和访问令牌。
  • 如何实现后台任务处理。
  • 如何为 API 端点添加分页功能。

敬请期待系列的下一部分:第 3 部分:Postgres 数据库

原文链接: https://bartlomiejmika.com/post/2021/how-to-build-an-api-server-in-go-part-2-simple-database/