一. 路由拆分与注册
1. 基本的路由注册
下面最基础的gin路由注册方式,适用于路由条目比较少的简单项目或者项目demo。以上例子都是基本路由注册
func helloHandler(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "Hello www.topgoer.com!",
})
}
func main() {
r := gin.Default()
r.GET("/topgoer", helloHandler)
if err := r.Run(); err != nil {
fmt.Println("startup service failed, err:%v\n", err)
}
}
2.路由拆分
项目的规模增大后就不太适合继续在项目的main.go文件中去实现路由注册相关逻辑了,我们会倾向于把路由部分的代码都拆分出来,形成一个单独的文件或包。
我们可以在routers.go文件中定义并注册路由信息:
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func helloHandler(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "Hello Gin",
})
}
func setupRouter() *gin.Engine {
r := gin.Default()
r.GET("/user", helloHandler)
return r
}
此时main.go中调用上面定义好的setupRouter函数:
func main() {
r := setupRouter()
if err := r.Run(); err != nil {
fmt.Println("startup service failed, err:%v\n", err)
}
}
此时的目录结构:
LearnGin
├── go.mod
├── go.sum
├── main.go
└── routers.go
二.基本原理
Gin框架的核心原理是基于HTTP路由匹配和处理。Gin使用了radix树来处理路由匹配,同时使用中间件来处理请求和响应,从而实现高性能的Web服务。
下面是Gin框架处理请求的主要流程:
1. 初始化Gin框架
在程序启动时,需要初始化Gin框架。主要是创建Gin框架的router实例,以及将一些默认的中间件添加到router中。
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
...
}
2.定义路由
定义HTTP路由,即定义HTTP方法、路径和相应的处理函数。Gin框架支持GET、POST、PUT、DELETE等HTTP方法,并支持路由参数、URL查询参数、POST请求等方式获取请求参数(有兴趣可以按照路由的拆分去进行尝试,这里只是最简单的路由)。
r.GET("/ping", func(c *gin.Context) {
c.String(http.StatusOK, "pong")
})
3.执行中间件
中间件是Gin框架处理请求和响应的重要部分,中间件可以在请求前、请求后、响应前和响应后进行处理。Gin框架支持全局中间件和局部中间件,使用方法非常简单。
r.Use(gin.Logger())
r.Use(gin.Recovery())
4.处理请求
当收到HTTP请求时,Gin框架会首先将请求交给radix树进行路由匹配,找到对应的路由后,再依次执行路由对应的中间件和处理函数,如下例子。
r.GET("/users/:id", func(c *gin.Context) {
id := c.Param("id")
// 根据ID查询用户
user := getUserById(id)
c.JSON(http.StatusOK, user)
})
5.处理响应
处理完请求后,Gin框架会将响应结果发送给客户端,响应结果可以是JSON、XML、HTML等格式。
c.JSON(http.StatusOK, gin.H{
"code": 0,
"msg": "success",
"data": data,
})
三.总结
总的来说,Gin框架的核心原理是基于radix树的路由匹配和中间件的处理。在使用Gin框架时,我们只需要关注定义路由、编写处理函数和中间件即可,Gin框架会自动处理HTTP请求和响应。