对业路由中的业务逻辑进行抽离
现在我们的路由和业务逻辑是在一起的;
这样会导致路由和业务逻辑耦合度高,不利于维护。
为了将路由和业务逻辑分离,我们可以将业务逻辑抽离到控制器中。
控制器是一个处理路由请求的函数,它负责接收路由参数,调用业务逻辑,返回响应。
与main.go同一级中,创建一个controllers/user/userController.go文件
userController.go代码如下
go
package controllers
import (
"github.com/gin-gonic/gin"
)
func UserList(c *gin.Context) {
c.JSON(200, gin.H{
"msg": "获取用户列表成功",
})
}
func UserDetail(c *gin.Context) {
c.JSON(200, gin.H{
"msg": "获取用户详情成功",
})
}
routers\user.go代码如下
go
package routers
import (
controllers "gin-quickstart/controllers/user"
"github.com/gin-gonic/gin"
)
// 注意首字母要大写的哈
func UserRouters(r *gin.Engine) {
apiUserRouters := r.Group("/user")
{
// 浏览器访问的是: http://localhost:8087/user/list
// 接口应该是:127.0.0.1:8087/user/list
// controllers是指的是包的名称,UserList是指的是包中的函数的名称
apiUserRouters.GET("/list", controllers.UserList)
// 浏览器访问的是: http://localhost:8087/user/detail
// 接口应该是:127.0.0.1:8087/user/detail
apiUserRouters.GET("/detail", controllers.UserDetail)
}
}
main.go代码如下
go
package main
import (
"gin-quickstart/routers"
"github.com/gin-gonic/gin"
)
// "gin-quickstart/routers" 表示引入 routers 包(也就是引入我们创建的路由文件夹),用于注册路由
func main() {
// 创建一个默认的路由引擎
r := gin.Default()
// 允许跨域中间件(注意:必须写在路由注册【之前】才对已注册路由生效)
r.Use(func(c *gin.Context) {
c.Header("Access-Control-Allow-Origin", "*") // 允许所有来源(学习阶段够用)
c.Header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
c.Header("Access-Control-Allow-Headers", "Content-Type")
// 浏览器发复杂请求前会先发 OPTIONS 预检,直接放行
if c.Request.Method == "OPTIONS" {
c.AbortWithStatus(204)
return
}
c.Next()
})
// 注册用户路由,routers表示的是路由包,
// UserRouters表示的是路由函数(也就是这个包中user.go文件中的函数)
routers.UserRouters(r)
// 启动服务,端口为8080,当然你也可以更改的哈
r.Run(":8087")
}