引入gin框架
上篇文章已经成功将测试数据写入数据库,那么今天我们就要将数据库中的文件取出来放到接口中去,为前后端联调奠定基础。要实现这一点,我们需要引入 golang的企业级框架gin。 Gin(Gin)是一个基于Go语言的Web框架,由Alexey Gordeev于2014年创建。Gin的设计目标是简单、快速且易于学习和使用。它具有高性能和灵活性,适用于各种规模的项目。
gin框架简介
以下是Gin的一些特点:
- 高性能:Gin采用了基于事件驱动的异步I/O模型,这使得它在处理大量并发请求时表现出色。同时,它还支持HTTP/2协议,以提高网络性能。
- 中间件支持:Gin内置了许多常用的中间件,如路由、日志记录、验证等。此外,您还可以轻松地添加自定义中间件来满足特定需求。
- 渲染:Gin支持多种模板引擎,如HTML、XML、JSON等。您可以根据需要选择合适的模板引擎进行渲染。
- RESTful API:Gin的设计灵感来自于RESTful架构风格,因此它非常适合构建RESTful API。您可以使用Gin轻松地创建和管理API端点。
- 错误处理:Gin提供了丰富的错误处理机制,可以帮助您更好地捕获和处理异常情况。
- 文档生成:Gin内置了文档生成功能,可以自动生成API文档,方便开发人员和客户端了解API的结构和使用方法。
引入gin框架到项目中
从官方文档中可以得知引入框架的流程。
下载gin框架
go get -u github.com/gin-gonic/gin
在项目中引入gin
在main.go中加入以下代码:
package main
import "github.com/gin-gonic/gin"
func main() {
//初始化gin
r := gin.Default()
//路由配置
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // 监听并在 localhost:8080 上启动服务
}
运行go.main文件,运行成功后在浏览器中打开localhost:8080/ping,如果在浏览器中显示
{"message":"pong"}
则表示gin框架成功引入并运行。
将main.go中的代码模块化
接下来,我们需要将gin框架的代码分离到模块中,方便我们使用和维护。 在router文件夹中新建app.go文件,用于存放路由配置信息:
package router
import (
"ginchat/service"
"github.com/gin-gonic/gin"
)
func Router() *gin.Engine {
r := gin.Default()
r.GET("/index", service.GetIndex)
return r
}
在main.go中调用router中的方法:
package main
import (
"ginchat/router"
)
func main() {
r := router.Router()
r.Run()
}
在service文件夹中新建index.go文件,配置路由传递的参数信息:
package service
import "github.com/gin-gonic/gin"
func GetIndex(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Welcome !!",
})
}
重新启动main.go文件,在浏览器中启动localhost:8080/index,如果显示以下信息,则表示运行成功:
{"message":"Welcome !!"}
至此,初级的gin框架的应用我们已经学会了,接下来我们需要将数据库中的数据导出到路由参数中去:
初始化数据库配置参数
初始化数据库
在config文件夹中,新建app.yml,用来配置一些基本的启动配置:
mysql:
dns:用户名:密码@tcp(数据库公网地址:3306)/ginchatcharset=utf8mb4&parseTime=True&loc=Local
这里配置的是数据库的初始连接配置。 配置好后,我们需要utils中配置调用函数,在utils中新建系统初始化文件system_init.go:
package utils
import (
"fmt"
"github.com/spf13/viper"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var DB *gorm.DB
func InitConfig() {
viper.SetConfigName("app")
viper.AddConfigPath("config")
err := viper.ReadInConfig()
if err != nil {
fmt.Println(err)
}
fmt.Println("config app: ", viper.Get("app"))
fmt.Println("config mysql: ", viper.Get("mysql"))
}
func InitMySql() {
DB, _ = gorm.Open(mysql.Open(viper.GetString("mysql.dns")), &gorm.Config{})
}
这里配置系统启动参数用到了viper库
Viper是一个Go语言的配置库,它提供了一种简单、灵活且功能强大的方式来读取和写入配置文件。Viper的目标是使配置文件的处理变得非常容易,同时保持代码的可读性和可维护性。
以下是Viper的一些特点:
- 简单易用:Viper的API非常简单直观,易于学习和使用。您只需要导入一个包并按照文档中的示例进行配置即可。
- 多种格式支持:Viper支持多种常见的配置文件格式,如JSON、YAML、INI等。您可以根据需要选择合适的格式进行配置。
- 嵌套结构支持:Viper允许您在配置文件中嵌套定义不同的配置项,从而更好地组织和管理配置信息。
- 验证器支持:Viper内置了丰富的验证器,可以帮助您确保配置文件的正确性和一致性。例如,您可以验证一个字符串是否为空、是否只包含特定的字符等等。
- 环境变量支持:Viper允许您从环境变量中读取配置信息,这使得配置文件更加灵活和可移植。
- 高级特性:Viper还提供了许多高级特性,如文件锁定、默认值设置、自定义命令等等。这些特性可以帮助您更好地控制配置文件的行为和处理过程。
这里我们定义了一个全局的DB变量,并通过viper库和gorm库将数据库初始化并导出给DB变量。这样我们就可以通过DB关键字进行数据库操作了。
数据库查表
接下来我们就可以在models文件夹中的user_basic.go中通过结构体获取到数据库中的表数据:
func GetUserList() []*UserBasic {
data := make([]*UserBasic, 10)
utils.DB.Find(&data)
for _, v := range data {
fmt.Println(v)
}
return data
}
返回的data则是我们所需要的表数据了。
将数据导入路由参数中
在service中新建文件user_service.go文件,用于将数据导入路由参数中。
package service
import (
"ginchat/models"
"github.com/gin-gonic/gin"
)
func GetUserList(c *gin.Context) {
data := make([]*models.UserBasic, 10)
data = models.GetUserList()
c.JSON(200, gin.H{
"message": data,
})
}
至此,配置已经全部完成。接下来就可以验证了。
验证数据
运行main.go文件,在浏览器中打开localhost:8080/user/getUserList,如果浏览器显示如下格式的数据,即为成功: