这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
概述
因为上一篇笔记记录了我对go后端项目结构的认识,其中特别提到了router这个在springboot中没见过的东西,所以今天借这篇文章记录一下我对go router的 更深入一点点的了解与使用。
入门路由注册
查看文档里的快速示例即可,这里注册一个get方法, 响应get请求,响应路径为/ping , 并写了处理函数,返回一个json数据 c.JSON(200, gin.H{"message": "pong",})
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.GET("/yuming", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "yuming",
})
})
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
路由拆分
由于我们的平常的项目都比较大,一个项目有众多的路由,不可能都放在main一个文件里,所以我们的路由函数 注册 主函数文件三部分往往是分开的,这时我们可以这样写
controller层文件的函数hello.go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
//路由
func pingHandler(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
}
func yumingHandler(c *gin.Context) {
c.JSON(200, gin.H{
"message": "yuming",
})
}
//在这里注册路由信息
func registRouter(Router *gin.Engine ) {
Router.GET("/hello", pingHandler)
Router.GET("/hello", yumingHandler)
}
路由文件 routers.go:
负责调用所有注册函数,完成路由注册,相当于边牧赶羊群。
package main
func Routers() *gin.Engine {
//获取路由
var Router = gin.Default()
registRouter(Router)
...//调用其他注册函数,注册其他路由
return Router
}
main文件只需要调用路由文件 routers.go的注册函数即可,相当于边牧主人牧场主。
package main
import "github.com/gin-gonic/gin"
func main() {
//获取并注册路由
Router = Routers()
Router.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
当然,但我们的项目不断扩大,并且由于模块功能的拆分,比如一个电商平台,有购物车模块,订单模块等,往往是每个模块一个路由文件,并且每个路由文件里都有一个注册函数,最后由路由文件 routers.go统一调用所有注册函数进行路由注册。
用这种方式,不用修改main的代码。main仍然只需调用routers.go中的Routers即可
路由router的其他知识点总结
参数处理
path参数
/yuming/:name 能匹配路径 /yuming/:xx , 并通过name := c.Param("name") 来获取参数name
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/yuming/:name", func(c *gin.Context) {
name := c.Param("name")
c.JSON(200, gin.H{
"message": name,
})
})
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
query参数
通过name := c.Query("name") 来获得路径的查询参数。如:/yuming?name=yuming
则获得参数 name=yuming
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/yuming", func(c *gin.Context) {
name := c.Param("name")
c.JSON(200, gin.H{
"message": name,
})
})
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
路由分组
通过api :=route.Group("/api")实现路由分组,返回值api仍是路由器。如:
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
//路由分组api
api :=route.Group("/api")
{
api.GET("/yuming", func(c *gin.Context) {
name := c.Param("name")
c.JSON(200, gin.H{
"message": name,
})
})
}
//路由分组admin
api :=route.Group("/admin")
{
api.GET("/cao", func(c *gin.Context) {
name := c.Param("lastName")
c.JSON(200, gin.H{
"message": lastName,
})
})
}
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
注意,在这里花括号中内容是作为一个单独的语句块,其中的变量是单独的作用域,同名变量会覆盖外层。
还有需要注意的一点是,路由分组后,请求路径前需要填上分组名称。如上面两个分组内的路由请求路径为:/api/yuming 和 /admin/cao
总结
在go中,相比java,router是一个比较新鲜的知识点,因为java中注册路由都是用注解的,感觉还是java中更方便。但是gin设计了router也有好处,我觉得至少把路由注册集中起来,更方便管理。router的知识也不算太复杂,大概就是参数传递,路由分组,路由拆分这几大块知识点。这里也没有进行深入,属于是初学者阶段,希望以后慢慢深入学习,学习到更多好用的技巧!