Echo框架 路由与控制器
路由是一个过程,指的是一个 http 请求,如何找到对应的控制器函数或者叫处理器函数。
控制器函数主要负责执行 http 请求-响应任务。
根据 MVC 设计模式,控制器不会把所有的请求-响应任务都干了,控制只是作为一个请求的入口、起到协调(调用各个模块)的作用。例如,调用几个 model 对象操作数据库,然后调用视图引擎把 html 结果展示出来。
1. Go Echo框架 范例
// 路由定义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) }
2. 路由规则
一条路由规则由三部分组成:
- 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 文件,不方便维护,可以参考第一章的项目结构,规划自己的业务模块。
本章介绍四种获取请求参数的方式:绑定 struct 数据、获取 Get 参数、获取 Post 参数以及获取路径参数。1. 绑定 struct 数据:通过将请求参数绑定到一个 struct 对象的方式获取数据。2. 获取 Get 请求数据:通过 echo.Context 对象的 QueryParam 函数可以直接获取 Get 请求参数。