GinRouterGinGinGinWeb

HttpRouter

HttpRouterHttpRouterHTTP路由多路复用器HttpRouterGinHttpRouter
HttpRouter
go get -u github.com/julienschmidt/httprouter
复制代码

路由与路由分组

1. 支持的HTTP方法
GETPOSTPUTPATCHOPTIONSHEADDELETE
router := gin.New()

router.GET("/testGet",func(c *gin.Context){
    //处理逻辑
})

router.POST("/testPost",func(c *gin.Context){
    //处理逻辑
})

router.PUT("/testPut",func(c *gin.Context){
    //处理逻辑
})

router.DELETE("/testDelete",func(c *gin.Context){
    //处理逻辑
})

router.PATCH("/testPatch",func(c *gin.Context){
    //处理逻辑
})

router.OPTIONS("/testOptions",func(c *gin.Context){
    //处理逻辑
})

router.OPTIONS("/testHead",func(c *gin.Context){
    //处理逻辑
})
复制代码
Any()
//可以处理GET,POST等各种请求
router.Any("/testAny",func(c *gin.Context){
    //处理逻辑
})
复制代码
Handle()Handle()
//定义处理POST请求的方法
router.Handle("POST","/testHandlePost",func(c *gin.Context){
    
})
//定义处理GET请求的方法
router.Handle("GET","/testHandleGet",func(c *gin.Context){
    
})
复制代码

2. 路由请求路径

定义路由时,都需要定义该路由的请求路径,在Gin框架中,通过其支持的多种请求方法,可以很容易实现Restful风格Api请求路径。

test
router.GET("test",func(c *gin.Context){
    
})
复制代码

除了直接匹配路径,Gin框架还支持使用通配符冒号(:)和星号(*)来匹配请求路径,如:

使用冒号(:)定义路由路径:

router.GET("user/:name",func(c *gin.Context){
    
})
复制代码

上面的请求路径,请求结果对应如下:

/user/gordon              匹配
/user/you                 匹配
/user/gordon/profile      不匹配
/user/                    不匹配
复制代码

使用星号(*)定义路由请求路径:

router.GET("user/*name",func(c *gin.Context){
    
})
复制代码

上面的请求路径,请求结果对应如下:

/user/gordon              匹配
/user/you                 匹配
/user/gordon/profile      匹配
/user/                    匹配
复制代码

3. 路由分组

gin.New()gin.Default()gin.EngineGETPOSTPUTPATCHOPTIONSHEADDELETEgin.Enginegin.RouterGroupgin.Engine

通过组合的方式,获取其他数据类型的字段和方法,正是Go语言面向对象编码的体现。

gin.Engine
type Engine struct {
    RouterGroup //组合gin.RouterGroup
   //省略其他字段
}
复制代码
gin.New()gin.Default()gin.Engine根路由分组

可以理解为,在Gin中定义的所有路由,都在根路由分组下面

gin.RouterGroup
type RouterGroup struct {
    Handlers HandlersChain
    // contains filtered or unexported fields
}
复制代码
定义路由分组
gin.RouterGroupGroup()
{}
router := gin.New()
user := router.Group("user")
{
    user.GET("profile",func(c *gin.Context)(){
        //处理逻辑
    })
    
     user.POST("modify-password",func(c *gin.Context)(){
        //处理逻辑
    })
}
复制代码

在路由中使用中间件

我们在《Go Web轻量级框架Gin学习系列:中间件使用详解》这篇文章中已经讲过在路由中如何使用中间件,下面作一个更加全面的了解。

1. Use()方法:全局中间件

Use()方法定义如下:

func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes
复制代码

示例代码

router := gin.New()
router.Use(gin.Loggter())//全局中间件
复制代码
gin.Engine根路由分组

2. 在分组中使用中间件

router := gin.New()
user := router.Group("user",gin.Logger())//通过Group第二个参数,使用中间件
{
    user.GET("profile",func(c *gin.Context)(){
        //处理逻辑
    })
    
     user.POST("modify-password",func(c *gin.Context)(){
        //处理逻辑
    })
}
复制代码

也可以使用返回的RouterGroup中的Use方法为路由分组应用中间件:

user := router.Group("user",gin.Logger()).Use(gin.Recovery())
复制代码

3. 在单个路由使用中间件

下面代码演示了在单个路由定义使用中间件的用法:

router := gin.New()
router.GET("profile",gin.Logger(),gin.Recovery(),func(c *gin.Context)(){
    //处理逻辑
})
复制代码

或者在GET等方法之后,再使用Use()方法,为该路由应用中间件:

router.GET("profile",func(c *gin.Context)(){
    //处理逻辑
}).Use(gin.Logger(),gin.Recovery())
复制代码

小结

HttpRoutermuxnet/httpHttpRouter