路由是请求与服务器端处理逻辑之间的桥梁,决定了客户端如何访问不同的资源。Gin 作为一个轻量级、高性能的 Go Web 框架,不仅提供了简洁直观的路由定义方式,还支持灵活的路由组(Router Group)管理,使开发者能够高效地组织 API 结构,避免路由混乱。
Gin 路由基础
在 Gin 中,路由的核心功能是将客户端的 HTTP 请求映射到相应的处理函数。Gin 提供了直观的 API 来定义路由,并支持不同类型的 HTTP 请求,如 GET、POST、PUT 和 DELETE。
初始化 Gin 引擎
在 Gin 中,我们需要创建一个 gin.Engine 实例来管理所有路由。可以通过 gin.Default() 或 gin.New() 进行初始化:
func main() {
r := gin.Default()
// r := gin.New()
r.Run(":8080")
}
Gin 处理多种 HTTP 方法
r.GET("/article", func(c *gin.Context) {
c.JSON(200, gin.H{"method": "GET"})
})
r.POST("/article", func(c *gin.Context) {
c.JSON(200, gin.H{"method": "POST"})
})
r.PUT("/article", func(c *gin.Context) {
c.JSON(200, gin.H{"method": "PUT"})
})
r.PATCH("/article", func(c *gin.Context) {
c.JSON(200, gin.H{"method": "PUT"})
})
r.DELETE("/article", func(c *gin.Context) {
c.JSON(200, gin.H{"method": "DELETE"})
})
Any() 与 NoRoute() 处理未匹配请求
// Any():用于匹配所有 HTTP 方法,例如:
r.Any("/any", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "This matches any HTTP method"})
})
// NoRoute():用于处理 404 请求,当请求路径未匹配到任何路由时执行
r.NoRoute(func(c *gin.Context) {
c.JSON(404, gin.H{"error": "Not Found"})
})
路由组
package main
import "github.com/gin-gonic/gin"
func main() {
// 设置 Gin 模式为 ReleaseMode 非调试模式
gin.SetMode(gin.ReleaseMode)
r := gin.Default()
// 定义 /api 路由组
api := r.Group("/api")
{
api.GET("/users", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "Get all users"})
})
api.POST("/users", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "Create a user"})
})
}
r.Run(":8080")
}
路由组与中间件
admin := r.Group("/admin", AuthMiddleware())
{
admin.GET("/dashboard", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "Admin Dashboard"})
})
}
// 认证中间件
func AuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.GetHeader("Authorization")
if token != "valid-token" {
c.JSON(401, gin.H{"error": "Unauthorized"})
c.Abort()
return
}
c.Next()
}
}
绑定控制器
定义控制器
package controllers
import "github.com/gin-gonic/gin"
type UserController struct{}
func (u *UserController) GetUsers(c *gin.Context) {
c.JSON(200, gin.H{"message": "Get all users"})
}
func (u *UserController) GetUserByID(c *gin.Context) {
id := c.Param("id")
c.JSON(200, gin.H{"user_id": id})
}
在路由组中注册控制器
package main
import (
"github.com/gin-gonic/gin"
"your_project/controllers"
)
func main() {
r := gin.Default()
userController := new(controllers.UserController)
api := r.Group("/api")
{
users := api.Group("/users")
{
users.GET("/", userController.GetUsers)
users.GET("/:id", userController.GetUserByID)
}
}
r.Run(":8080")
}