gin的控制器與路由

1.概述

  • 路由是一個過程,指的是一個http請求,如何找到對應的處理器函數(也能夠叫控制器函數),Gin框架的路由是基於httprouter包實現的。
  • 控制器是在路由完成了URL檢測和路由檢測以後,路由器會分發請求到對應的路由地址,這也是應用請求的生命週期中最重要的一個環節。

在這一步驟中,完成應用的業務邏輯及數據返回。api

2.路由定義

2.1.http請求方法

經常使用的http請求方法有下面4種:app

  • GET
  • POST
  • PUT
  • DELETE

2.2.url路徑

gin框架,url路徑有三種寫法:框架

  • 靜態url路徑
  • 帶路徑參數的url路徑
  • 帶星號(*)模糊匹配參數的url路徑

例子:函數

// 例子1, 靜態Url路徑, 即不帶任何參數的url路徑
/users/center
/user/111
/food/12

// 例子2,帶路徑參數的url路徑,url路徑上面帶有參數,參數由冒號(:)跟着一個字符串定義。
// 路徑參數值能夠是數值,也能夠是字符串

//定義參數:id, 能夠匹配/user/1, /user/899 /user/xiaoli 這類Url路徑
/user/:id

//定義參數:id, 能夠匹配/food/2, /food/100 /food/apple 這類Url路徑
/food/:id

//定義參數:type和:page, 能夠匹配/foods/2/1, /food/100/25 /food/apple/30 這類Url路徑
/foods/:type/:page

// 例子3. 帶星號(*)模糊匹配參數的url路徑
// 星號表明匹配任意路徑的意思, 必須在*號後面指定一個參數名,後面能夠經過這個參數獲取*號匹配的內容。

//以/foods/ 開頭的全部路徑都匹配
//匹配:/foods/1, /foods/200, /foods/1/20, /foods/apple/1 
/foods/*path

//能夠經過path參數獲取*號匹配的內容。

2.3.3.分組路由

在作api開發的時候,若是要支持多個api版本,咱們能夠經過分組路由來實現api版本處理。post

router := gin.Default()

// 建立v1組
v1 := router.Group("/v1")
{
    // 在v1這個分組下,註冊路由
    v1.POST("/login", loginEndpoint)
    v1.POST("/submit", submitEndpoint)
    v1.POST("/read", readEndpoint)
}

// 建立v2組
v2 := router.Group("/v2")
{
    // 在v2這個分組下,註冊路由
    v2.POST("/login", loginEndpoint)
    v2.POST("/submit", submitEndpoint)
    v2.POST("/read", readEndpoint)
}

上面的例子將會註冊下面的路由信息:url

  • /v1/login
  • /v1/submit
  • /v1/read
  • /v2/login
  • /v2/submit
  • /v2/read

路由分組,其實就是設置了同一類路由的url前綴。code

3.控制器

路由須要配合控制器才能完成一次請求,下面咱們來看一下控制器的定義。router

控制器函數定義:對象

func HandlerFunc(c *gin.Context)

控制器函數接受一個上下文參數。
能夠經過上下文參數,獲取http請求參數,響應http請求。生命週期

下面咱們經過一個例子看一下控制器的定義:

//實例化gin實例對象。
r := gin.Default()
    
//定義post請求, url路徑爲:/users, 綁定saveUser控制器函數
r.POST("/users", saveUser)

//定義get請求,url路徑爲:/users/:id  (:id是參數,例如: /users/10, 會匹配這個url模式),綁定getUser控制器函數
r.GET("/users/:id", getUser)

//定義put請求
r.PUT("/users/:id", updateUser)

//定義delete請求
r.DELETE("/users/:id", deleteUser)


//控制器函數實現
func saveUser(c *gin.Context) {
    ...忽略實現...
}

func getUser(c *gin.Context) {
    ...忽略實現...
}

func updateUser(c *gin.Context) {
    ...忽略實現...
}

func deleteUser(c *gin.Context) {
    ...忽略實現...
}

提示:實際項目開發中不要把路由定義和控制器函數都寫在一個go文件,不方便維護,能夠參考項目結構,規劃本身的業務模塊。

出處 gin從入門到實踐更多精彩文章,請關注個人博客 SOCKSTACK,分享個人工做經驗。
相關文章
相關標籤/搜索