一、概述
路由是一個過程,指的是一個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文件,不方便維護,可以上一篇項目結構,規划自己的業務模塊。