如何使用Go语言构建API服务器 - 第二部分:简单数据库
让我们开始学习如何在 Go 应用程序中构建JSON 数据库(Golang Scrible)来设置项目数据层,适合初学者学习。未来的文章中,我们将逐步替换为更标准的数据库。
系列文章目录
- 如何在 Go 中构建 API 服务器 – 第 1 部分:基本服务器
- 如何在 Go 中构建 API 服务器 – 第 2 部分:简单数据库
- 如何在 Go 中构建 API 服务器 – 第 3 部分:Postgres 数据库
- 如何在 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 端点。以下是需要注意的几点:
- Content-Type 限制:API 端点仅接受
application/json格式的数据。这样可以利用 Go 标准库中的encoding/json包进行编码和解码。 - 数据格式存储:将请求和响应的数据格式定义在
models包中。
密码处理
创建一个 password.go 文件,用于处理用户密码的哈希操作。
使用编码和解码函数
以下是 user.go 文件的部分代码示例:
json.NewDecoder(req.Body).Decode(&userStruct)
json.NewEncoder(resp.Body).Encode(userStruct)
需要注意:
json.NewDecoder和Decode方法用于将请求的字节流解码为结构体。json.NewEncoder和Encode方法用于将结构体编码为字节流并返回响应。
用户注册与登录
注册用户
启动服务器后,运行以下命令以测试用户注册功能:
$ 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/