Gin框架-路由与中间件
大约 2 分钟
路由与中间件
路由
路由分组, 将一类api分为一组, 可以在这个组加统一的中间件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func UserView(c *gin.Context) {
path := c.Request.URL
fmt.Println(c.Request.Method, path)
}
func main() {
r := gin.Default()
apiGroup := r.Group("api")
// apiGroup.Use() 加中间件
UserGroup(apiGroup)
r.Run(":8080")
}
func UserGroup(r *gin.RouterGroup) {
r.GET("users", UserView)
r.POST("users", UserView)
r.PUT("users", UserView)
r.DELETE("users", UserView)
}
ResetFul Api 规范
// 在没有resetful规范时, 表示创建用户, 删除用户
/api/user_create
/api/user/create
/api/user/add
/api/add_create
/api/user_remove
/api/user/delete
// 使用resetful规范
GET /api/users 用户列表
POST /api/users 创建用户
PUT /api/users/:id 更新用户信息
DELETE /api/users 批量删除用户
DELETE /api/users/:id 删除单个用户
中间件
局部中间件
我想请求Home这个方法, 可以这么做:
func Home(c *gin.Context) {
fmt.Println("Home")
c.String(200, "HOME")
}
func main() {
r := gin.Default()
r.GET("", Home)
r.Run(":8080")
}
加一层中间件
func Home(c *gin.Context) {
fmt.Println("Home")
c.String(200, "HOME")
}
func M(c *gin.Context) {
fmt.Println("M的请求部分")
c.Next() // 放行
fmt.Println("M的响应部分")
}
func main() {
r := gin.Default()
r.GET("", M, Home) // 这里走的顺序是:M的请求部分->Home->M的响应部分
r.Run(":8080")
}
输出结果:
M的请求部分
Home
M的响应部分
可以使用Abort进行拦截, 会原路拦截
全局中间件
全局也就是路由组, 这就是路由组的意义
使用Use去注册全局中间件,Use接收的参数也是多个HandlerFunc
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func Home(c *gin.Context) {
fmt.Println("Home")
c.String(200, "HOME")
}
func GM1(c *gin.Context) {
fmt.Println("GM1的请求部分")
c.Next()
fmt.Println("GM1的响应部分")
}
func GM2(c *gin.Context) {
fmt.Println("GM2的请求部分")
c.Next()
fmt.Println("GM2的响应部分")
}
func main() {
r := gin.Default()
g := r.Group("api")
g.Use(GM1, GM2)
g.GET("users", Home)
r.Run(":8080")
}
中间件传参
func Home(c *gin.Context) {
fmt.Println("Home")
fmt.Println(c.Get("GM1"))
fmt.Println(c.Get("GM2"))
c.String(200, "HOME")
}
func GM1(c *gin.Context) {
fmt.Println("GM1的请求部分")
c.Set("GM1", "这是GM1发送时传的参数") // 可以设置任何类型的参数
c.Next()
fmt.Println("GM1的响应部分")
}
func GM2(c *gin.Context) {
fmt.Println("GM2的请求部分")
c.Set("GM2", "这是GM2发送时传的参数")
c.Next()
fmt.Println("GM2的响应部分")
}
func main() {
r := gin.Default()
g := r.Group("api")
g.Use(GM1, GM2)
g.GET("users", Home)
r.Run(":8080")
}
输出:
GM1的请求部分
GM2的请求部分
Home
这是GM1发送时传的参数 true
这是GM2发送时传的参数 true
GM2的响应部分
GM1的响应部分