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庫之上的封裝,更加易於使用,咱們能夠定義單個路由接收用戶請求,也能夠將路由分組,更加易於管理,也易於應用中間件,進行統一攔截處理。


你的關注,是我寫做路上最大的鼓勵!

相關文章
相關標籤/搜索