如何在杜松子酒中组合路线组?
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/create
或 localhost: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.TodoRoutes
和 userrouter.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 社区
我已经为 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/create
或 localhost: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.TodoRoutes
和 userrouter.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)
}
}
此答案基于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 社区