在Gin框架中,分组路由和分组中间件是实现RESTful API时非常重要的特性。通过分组路由,我们可以将相关的路由组织在一起,提高代码的可读性和可维护性。而分组中间件则允许我们在一个路由组内统一应用一系列的中间件,对请求进行预处理或后处理。
下面,我们将详细介绍Gin的分组路由和分组中间件。
1. 分组路由
Gin的Group
方法允许我们创建路由组,可以将一系列具有相同前缀的路由组合在一起。这样做不仅使得路由定义更加清晰,还可以通过为路由组添加中间件来统一处理这些路由的请求。
2. 分组中间件
分组中间件通过Use
方法应用到路由组上,这个中间件会在该组内的所有路由处理之前或之后执行。这是处理日志记录、认证、权限校验等常见需求的强大工具。
3. 中间件写法
在Gin中,中间件本质上是一个具有gin.HandlerFunc
签名的函数。这里介绍两种常见的中间件写法:
- 全局中间件 :直接绑定到全局的
*gin.Engine
实例上。 - 分组中间件 :通过
Group
方法创建的路由组调用Use
方法添加。
4. 代码示例
go
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
type UserInfo struct {
Name string `json:"name"`
Age int `json:"age"`
}
type ArticleInfo struct {
Title string `json:"title"`
Content string `json:"content"`
}
type Response struct {
Code int `json:"code"`
Data interface{} `json:"data"`
Msg string `json:"msg"`
}
func UserListView(c *gin.Context) {
var userList []UserInfo = []UserInfo{
{"a", 1},
{"b", 2},
{"c", 3},
}
c.JSON(200, Response{0, userList, "ok"})
}
func ArticleListView(c *gin.Context) {
var articleList []ArticleInfo = []ArticleInfo{
{"go", "article 1 content"},
{"java", "article 2 content"},
{"c", "article 3 content"},
}
c.JSON(200, Response{0, articleList, "ok"})
}
func getOne(c *gin.Context) {
c.JSON(200, Response{0, UserInfo{"a", 1}, "ok"})
}
func userHandler() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("userHandler...in")
c.Next()
fmt.Println("userHandler...out")
}
}
func articleHandler(c *gin.Context) {
fmt.Println("articleHandler...in")
c.Next()
fmt.Println("articleHandler...out")
}
func main() {
r := gin.Default()
// 分组路由和中间件
apiGroup := r.Group("/api")
{
userManage := apiGroup.Group("userManage").Use(userHandler())
{
userManage.GET("/users", UserListView)
userManage.GET("/user/:id", getOne) // 示例:获取单个用户
}
articleManage := apiGroup.Group("articleManage").Use(articleHandler)
{
articleManage.GET("/articles", ArticleListView)
// 可以在这里添加更多与文章相关的路由
}
}
r.Run(":8080")
}