Golang ECHO路由與控制器【2】


一、概述

路由是一個過程,指的是一個http請求,如何找到對應的控制器函數或者叫處理器函數。

控制器函數主要負責執行http請求-響應任務。

提示:根據MVC設計模式,控制器不會把所有的請求-響應任務都干了,控制只是作為一個請求的入口、起到協調(調用各個模塊)的作用。例如,調用幾個model對象操作數據庫,然后調用視圖引擎把html結果展示出來。

一個簡單的例子:

// 路由定義post請求, url路徑為:/users, 綁定saveUser控制器函數
e.POST("/users", saveUser)

// 控制器函數
func saveUser(c echo.Context) error {
    username := c.FormValue("username")
    username := c.FormValue("username")
    
    //調用model保存數據
    
    html := 調用模板引擎渲染html頁面
    //以Html頁面的形式響應請求
    return c.HTML(http.StatusOK, html)
}

二、路由規則

一條路由規則由三部分組成:

  • http請求方法
  • url路徑
  • 控制器函數

1.http請求方法

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

  • GET
  • POST
  • PUT
  • DELETE

2.url路徑

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

  • 靜態url路徑
  • 帶路徑參數的url路徑
  • 帶星號(*)模糊匹配參數的url路徑
// 例子1, 靜態Url路徑, 即不帶任何參數的url路徑
/users/center
/user/101
/food/100

// 例子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/1, /foods/200, /foods/1/20, /foods/apple/1 
//以/foods/ 開頭的所有路徑都匹配
/foods/*

3.Url路徑匹配順序

上面列出了三種Url路徑的寫法,那么如果項目里面三種路徑都有使用,而且出現一個http請求匹配多種路徑的時候,echo框架選擇哪個路徑?

例如:一個http Get請求的路徑為 /user/10

同時匹配下面三種url路徑定義:

/user/10
/user/:id
/user/*

如果出現上述,一個http請求路徑匹配多個定義的url路徑,echo框架按下面順序匹配,先匹配到那個就用那個定義。

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

4.控制器函數

控制器函數定義:

func HandlerFunc(c echo.Context) error

控制器函數接受一個上下文參數,並返回一個錯誤。
可以通過上下文參數,獲取http請求參數,響應http請求。

5.路由定義例子

//實例化echo對象。
e := echo.New()
	
//定義post請求, url路徑為:/users, 綁定saveUser控制器函數
e.POST("/users", saveUser)

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

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

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


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

func getUser(c echo.Context) error {
    ...忽略實現...
}

func updateUser(c echo.Context) error {
    ...忽略實現...
}

func deleteUser(c echo.Context) error {
    ...忽略實現...
}

注意:開發中路由定義和控制器函數都寫在一個go文件,不方便維護,可以上一篇項目結構,規划自己的業務模塊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM