Gin 路由管理

55 阅读2分钟

路由是请求与服务器端处理逻辑之间的桥梁,决定了客户端如何访问不同的资源。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")
}