目录

gin~路由

普通路由

1
2
3
r.GET("/index", func(c *gin.Context) {...})
r.GET("/login", func(c *gin.Context) {...})
r.POST("/login", func(c *gin.Context) {...})

上面列出的,是普通路由,是最常用的。

Any

是比较特殊的路由,Any,只要输入匹配的路径,不管是什么方法,GET , POSTPUT DELETE 等,都会走到这个逻辑里,例如

1
2
3
4
5
r.Any("/AnyMethod", func(c *gin.Context) {
    c.JSON(200, gin.H{
    "message": "这里返回any页面",
    })
})

/gin路由/20230330214905.png

Noroute

也比较特殊,用于匹配不到路径时返回的信息,例如

1
2
3
r.NoRoute(func(c *gin.Context) {
		c.String(http.StatusNotFound, "没有该页面")
	})

也可自定义返回页面或者是信息

1
2
3
4
5
r.NoRoute(func(c *gin.Context) {
	c.JSON(200, gin.H{
	     "message": "没有找到对应页面",
		})
  })

为没有配置处理函数的路由添加处理程序,默认情况下它返回404代码,下面的代码为没有匹配到路由的请求都返回views/404.html页面。

1
2
3
r.NoRoute(func(c *gin.Context) {
		c.HTML(http.StatusNotFound, "views/404.html", nil)
	})

可以对比一下两者的区别,在正式项目里,为了美观,可以使用自己公司定义的not found html文件。自己定义文字还不如用原生的显示。

路由组

我们可以将拥有共同URL前缀的路由划分为一个路由组。习惯性一对{}包裹同组的路由,只是为了看着清晰,你用不用{}包裹功能上没什么区别。事实上不如不要{},看起来很烦!而且格式容易出错。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
r := gin.Default()
userGroup := r.Group("/user")
// 不用{}也可
{
    userGroup.GET("/index", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "这里user的index页面",
        })
    })
    userGroup.GET("/login", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "这里是user的login页面",
        })
    })
}

shopGroup := r.Group("/shop")
shopGroup.GET("/index", func(c *gin.Context) {
    c.JSON(200, gin.H{
        "mesage": "这是shop的index页面",
    })
})
shopGroup.GET("/cart", func(c *gin.Context) {
    c.JSON(200, gin.H{
        "message": "这是shop的cart页面",
    })
})
r.Run()

运行,请求http://127.0.0.1:8080/user/index, 会返回

1
2
3
{
    "message": "这里user的index页面"
}
1
[GIN] 2023/03/31 - 09:41:47 | 200 |       958.9µs |       127.0.0.1 | GET      "/user/index"

可以看控制台打出的日志,即便是本地调试,还是很快的,达到了微秒级别。

路由组也是支持嵌套的,嵌套路由组,没啥意义,而且又容易弄混,知道就好,选择性忽略。例如:

1
2
3
4
5
6
7
8
9
shopGroup := r.Group("/shop")
	{
		shopGroup.GET("/index", func(c *gin.Context) {...})
		shopGroup.GET("/cart", func(c *gin.Context) {...})
		shopGroup.POST("/checkout", func(c *gin.Context) {...})
		// 嵌套路由组
		xx := shopGroup.Group("xx")
		xx.GET("/oo", func(c *gin.Context) {...})
	}

通常我们将路由分组用在划分业务逻辑或划分API版本时。

路由原理

Gin框架中的路由使用的是httprouter这个库。其基本原理就是构造一个路由地址的前缀树。

这个就要仔细研究大明老师的课程了!怎么去设计路由树!这个还是很重要的!