1. 路由定义
Gin 提供了简单直观的方法来定义路由。可以通过 router.Method
来处理各种 HTTP 方法(如 GET
、POST
等)。
示例:简单的静态路由
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package main
import ( "github.com/gin-gonic/gin" )
func main() { r := gin.Default()
r.GET("/hello", func(c *gin.Context) { c.JSON(200, gin.H{"message": "Hello, World!"}) })
r.POST("/submit", func(c *gin.Context) { c.JSON(200, gin.H{"status": "Submitted!"}) })
r.Run(":8080") }
|
在上述代码中,不同的 HTTP 方法可以分别定义不同的路由。
2. 动态路由
动态路由允许路径中包含参数,从而更灵活地匹配请求。
示例:使用路径参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package main
import ( "github.com/gin-gonic/gin" )
func main() { r := gin.Default()
r.GET("/user/:id", func(c *gin.Context) { userID := c.Param("id") c.JSON(200, gin.H{"user_id": userID}) })
r.GET("/files/*filepath", func(c *gin.Context) { filepath := c.Param("filepath") c.JSON(200, gin.H{"file": filepath}) })
r.Run(":8080") }
|
解释:
:id
定义了一个路径参数,捕获单个路径段。
*filepath
捕获路径的所有后续部分,适合匹配嵌套结构。
3. 路由分组(Group)
当项目规模变大时,路由分组可以帮助我们更好地组织代码。通过分组,可以将相关路由归类到一起,并为其添加公共前缀或中间件。
示例:简单的路由分组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package main
import ( "github.com/gin-gonic/gin" )
func main() { r := gin.Default()
userGroup := r.Group("/user") { userGroup.GET("/profile", func(c *gin.Context) { c.JSON(200, gin.H{"message": "User Profile"}) })
userGroup.POST("/login", func(c *gin.Context) { c.JSON(200, gin.H{"status": "Login Successful"}) }) }
r.Run(":8080") }
|
示例:带中间件的路由分组
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 29 30
| package main
import ( "github.com/gin-gonic/gin" )
func authMiddleware(c *gin.Context) { token := c.GetHeader("Authorization") if token != "valid-token" { c.JSON(401, gin.H{"error": "Unauthorized"}) c.Abort() return } c.Next() }
func main() { r := gin.Default()
adminGroup := r.Group("/admin") adminGroup.Use(authMiddleware) { adminGroup.GET("/dashboard", func(c *gin.Context) { c.JSON(200, gin.H{"message": "Welcome to Admin Dashboard"}) }) }
r.Run(":8080") }
|
解释:
Group
用于创建带有公共前缀的路由集合。
Use
方法为整个组添加中间件,简化安全或日志管理的逻辑。
4. 路由优先级
Gin 路由匹配是按照定义顺序进行的,因此动态路由和静态路由之间可能出现冲突。
示例:路由匹配优先级
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package main
import ( "github.com/gin-gonic/gin" )
func main() { r := gin.Default()
r.GET("/user/home", func(c *gin.Context) { c.JSON(200, gin.H{"message": "User Home"}) })
r.GET("/user/:id", func(c *gin.Context) { userID := c.Param("id") c.JSON(200, gin.H{"user_id": userID}) })
r.Run(":8080") }
|
在上述代码中,/user/home
的静态路由优先于动态路由 /user/:id
进行匹配。
5. 总结
Gin 框架的路由系统提供了强大的功能:
- 静态路由:简单直接,用于固定路径的请求。
- 动态路由:灵活强大,用于处理参数化路径。
- 路由分组:帮助组织代码,适合大型项目。
- 中间件集成:方便实现公共逻辑。