如何在杜松子酒中组合路线组?

How to combine group of routes in gin?

我已经为 gin 路由创建了两个不同的组,特别是 /user/todo 在两个不同的包中,我想将它们合并到一个文件中。这是我的 userroutes.go 文件。

package userrouter

import (
    "github.com/gin-gonic/gin"
)

//UserRoutes for user
func UserRoutes() *gin.RouterGroup {

    r := gin.Default()

    v1 := r.Group("/user")
    {

        v1.GET("/hello", func(c *gin.Context) {
            c.JSON(200, gin.H{
                "message": "pong",
            })
        })

    }
    return v1

}

todoroutes.go作为

package todorouter

import (
    "github.com/gin-gonic/gin"
)

//TodoRoutes for creating Todo
func TodoRoutes() *gin.RouterGroup {

    r := gin.Default()

    v2 := r.Group("/todo")
    {

        v2.GET("/hello", func(c *gin.Context) {
            c.JSON(200, gin.H{
                "message": "pong",
            })
        })

    }
    return v2

}

然后想将它们合并到routes.go

package router

import (
    todo "TODO/api/Routes/Todo/TodoRoutes"
    user "TODO/api/Routes/User/UserRoutes"
    "fmt"

    "github.com/gin-gonic/gin"
)


//Router for all routes
func Router() {
    // r := gin.Default()
    userRoutes := user.UserRoutes()
    todoRoutes := todo.TodoRoutes()

}

如何将它们合并到一个文件中,以便可以使用 localhost:8081/api/user/createlocalhost:8081/api/todo/create 等前缀 /api 来获取它们。另外我需要在我创建的每条路线中创建 r := gin.Default() 还是可以使用一次来完成?谢谢。

只需创建一个超级组,然后在其下创建您的组。显示我的意思的代码示例:

    router := gin.New()
    
    superGroup := router.Group("/api")
    {
        userGroup := superGroup.Group("/user")
        {
            // user group handlers
        }
    
        todoGroup := superGroup.Group("/todo")
        {
            // todo group handlers
        }
    }

使用此代码,您无法像现在这样创建组,因为您的函数 todorouter.TodoRoutesuserrouter.UserRoutes 都实例化了它们自己的 gin.Engine。所以你必须把顶级引擎和/api组移到一个共同的地方。

如果需要,您可以将 api 组对象作为函数参数传递。示例:

//TodoRoutes for creating Todo
func TodoRoutes(apiGroup *gin.RouterGroup) {

    v2 := apiGroup.Group("/todo")
    {

        v2.GET("/hello", func(c *gin.Context) {
            c.JSON(200, gin.H{
                "message": "pong",
            })
        })

    }
}

不过,为了让您的代码井井有条,我的建议是在同一个地方实例化所有路由器,然后将处理程序放在单独的包中。

// package todoroutes
func HandleHello(c *gin.Context) {
            c.JSON(200, gin.H{
                "message": "pong",
            })
}

// package router
    router := gin.New()
    
    superGroup := router.Group("/api")
    {
        userGroup := superGroup.Group("/user")
        {
             userGroup.GET("/hello", todoroutes.HandleHello)
        }
    }

此答案基于。这是我对类似问题的解决方案。我创建了一个超级组 ("/api/v1"),然后在其下添加子组("users"、"books")。我能够将子组放入不同的文件中,并向它们发送 gin.RouterGroup() 的单个实例。结果我有了这个漂亮干净的文件夹结构:

controllers/
  user_controllers
  book_controllers
routes/
  user_routes
  book_rontrollers
  index
middlewares/
  all
main.go

main.go

func startServer() {
    app := gin.New()

    router := app.Group("/api/v1")
    routes.AddRoutes(router)

    utils.ConnectDatabase()

    app.Run(":5500")
}

routes/book_routes.go

package routes

func bookRoutes(superRoute *gin.RouterGroup) {
    booksRouter := superRoute.Group("/books")
    {
        booksRouter.GET("/", controllers.BookControllers.GetBooks)

        booksRouter.POST("/", controllers.BookControllers.CreateBook)
    }
}

routes/user_routes.go

package routes

func userRoutes(superRoute *gin.RouterGroup) {
    booksRouter := superRoute.Group("/users")
    {
        booksRouter.GET("/", controllers.UserControllers.GetUsers)

        booksRouter.POST("/", controllers.UserControllers.CreateUser)
    }
}

routes/index.go

func AddRoutes(superRoute *gin.RouterGroup) {
    bookRoutes(superRoute)
    userRoutes(superRoute)
}

感谢 Whosebug 社区