Go Web轻量级框架Gin学习系列:路由分组

原创做者,公众号【程序员读书】,欢迎关注公众号,转载文章请注明出处哦。git

在这篇文章中咱们来说一讲Gin框架路由(Router)的设置,Gin框架的路由设置很是简单,咱们在前面几篇学习Gin框架的文章中,几乎每一个示例都会见到Gin的路由定义,Gin框架就是经过定义路由以及处理该路由对应的Handler来接收用户的Web请求。程序员

HttpRouter

Gin框架的路由实际是使用第三方的HttpRouter库,HttpRouter是一个轻量级高性能的HTTP请求路由器(路由多路复用器),更简单地理解,HttpRouter是Go的net/http包中ServeMux更好的实现,因为Gin框架采用了HttpRouter,所以性能有很大的提高。github

使用如下命令,能够在本地GOPATH中安装HttpRouterbash

go get -u github.com/julienschmidt/httprouter
复制代码

路由与路由分组

1. 支持的HTTP方法

定义路由是为了处理HTTP请求,而HTTP请求包含不一样方法,包括GET,POST,PUT,PATCH,OPTIONS,HEAD,DELETE等七种方法,Gin框架中都有对应的方法来定义路由。框架

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){
    //处理逻辑
})
复制代码

上面经过对应方法建立的路由,只能处理对应请求方法,若是GET定义的路由没法处理POST请求,咱们能够经过Any()方法定义能够处理任何请求的路由。函数

//能够处理GET,POST等各类请求
router.Any("/testAny",func(c *gin.Context){
    //处理逻辑
})
复制代码

除了上面几种简便的方法,也可使用Handle()建立路由,经过指定Handle()函数的第一个参数来肯定处理何种请求:post

//定义处理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框架还支持使用通配符冒号(:)和星号(*)来匹配请求路径,如:ui

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

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.Engine结构体实例时,而后可使用该实例中的GET,POST,PUT,PATCH,OPTIONS,HEAD,DELETE等方法来定义处理请求的路由,而其实gin.Engine的路由功能是经过组合gin.RouterGroup来实现的,从下面的gin.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返回的结构体中的Use()调用中间件是全局中间件呢?缘由在于全部的路由分组都在根路由分组下面。

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())
复制代码

小结

第三方库HttpRouter定义了本身内置路由多路复用器(mux),弥补了Go语言net/http包中内置路由多路复用器的不足,而Gin框架中路由是在HttpRouter库之上的封装,更加易于使用,咱们能够定义单个路由接收用户请求,也能够将路由分组,更加易于管理,也易于应用中间件,进行统一拦截处理。


你的关注,是我写做路上最大的鼓励!

相关文章
相关标签/搜索