这是我参与「第五届青训营」伴学笔记创作活动的第 15 天
概述
- 重定向:重定向和转发
- 路由
重定向
转发和重定向的区别
Forward(转发):服务器内部执行,对客户端是黑盒子。
redirect(重定向):服务器返回信息,客户端自动向另一个地址发请求
HTTP重定向(重定向)
r.GET("/", func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently, "http://www.baidu.com")
})
路由重定向(转发)
r.GET("/a", func(c *gin.Context) {
c.Request.URL.Path = "/b" // 重定向到b
r.HandleContext(c) // 一些处理
})
r.GET("/b", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "b"})
})
Gin 路由
r.Any("/user", func(c *gin.Context) {
switch c.Request.Method {
case http.MethodGet:
c.JSON(http.StatusOK, gin.H{"method": "GET"})
case http.MethodPost:
c.JSON(http.StatusOK, gin.H{"method": "POST"})
case http.MethodPut:
c.JSON(http.StatusOK, gin.H{"method": "PUT"})
case http.MethodDelete:
c.JSON(http.StatusOK, gin.H{"method": "DELETE"})
}
})
Any 可以接收 GET, POST, PUT, PATCH, HEAD, OPTIONS, DELETE, CONNECT, TRACE 请求方法
将相同路由的不同请求放在一起,和路由组的理念相同。
在使用的时候还要注意开发规范,尽量减少魔法值【参考5】。所以用 http 封装的常量来替代字符串
404
r.NoRoute(func(c *gin.Context) {
c.JSON(http.StatusNotFound, gin.H{"code": 404, "message": "Not Found"})
})
这里只是演示处理方法,实际情况自行处理。
路由组
顾名思义,路由组是将不同的路由依据前缀分组。
路由组示例
userGroup := r.Group("/user")
{
userGroup.GET("/index", func(c *gin.Context) {...})
userGroup.GET("/login", func(c *gin.Context) {...})
userGroup.POST("/login", func(c *gin.Context) {...})
}
相当于 /user/index...
使用路由组,整体代码的结构就会更加清晰,路由关系也会更加明了。使用路由组让你的代码更优雅。
路由组嵌套
gin 中的路由组是支持嵌套的,如下
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) {...})
}
路由原理
gin 框架中的路由是使用的 httprouter 这个库。其主要的原理就是构造一个路由前缀树。