Echo框架 教程
Echo框架是一个使用 go 语言开发的性能、可扩展、轻量级的 Web 框架。
Echo框架简单高效,几行代码就可以启动一个高性能的 HTTP 服务端。
Echo框架默认只包含了 MVC 框架的 C(Controller)控制器部分,负责 URL 路由和控制器部分。V(View)视图部分和 M(Model)数据操作部分,我们可以使用自己喜欢的工具库来操作。
1. 教程目录
2. 安装 Echo框架
安装 Echo 包:
go get github.com/labstack/echo/v4
3. 使用 Echo框架
如何开始一个 Http Server?创建 httpserver.go 文件,代码如下:
package main import ( "net/http" // 导入echo包 "github.com/labstack/echo/v4" ) func main() { // 实例化echo对象。 e := echo.New() // 注册一个Get请求, 路由地址为: /test 并且绑定一个控制器函数, 这里使用的是闭包函数。 e.GET("/test", func(c echo.Context) error { // 控制器函数直接返回一个字符串,http 响应状态为 http.StatusOK,就是 200 状态。 return c.String(http.StatusOK, "欢迎访问 codebaoku.com") }) //启动 http server, 并监听8080端口,冒号(:)前面为空的意思就是绑定网卡所有 ip 地址,本机支持的所有 ip 地址都可以访问。 e.Start(":8080") }
运行 http server
$ go run httpserver.go
通过浏览器访问 http://localhost:8080/test 浏览器会显示: 欢迎访问 codebaoku.com
Echo Web框架的代码非常简洁,就几行代码一个 http server 的主要的初始化工作就搞定了,只要添加自己的业务代码就行。
4. 项目结构
通过上面的例子,大家都知道 echo 大致是怎么使用的,但是实际项目业务功能会很多,我们不可能把所有代码都写在一个 go 文件里面或者写在一个 main 入口函数里面;我们需要对项目结构做一些规划,方便维护代码以及扩展。
echo web 框没有对项目结构做出限制,我们可以根据自己项目需要自行设计。
这里给出一个典型的 MVC 框架大致的项目结构的例子,大家可以参考下:
├── conf #项目配置文件目录 │ └── config.toml #大家可以选择自己熟悉的配置文件管理工具包例如:toml、xml等等 ├── controllers #控制器目录,按模块存放控制器,必要的时候可以继续划分子目录。 │ ├── food.go │ └── user.go ├── main.go #项目入口,这里负责echo框架的初始化,注册路由信息,关联控制器函数等。 ├── models #模型目录,负责项目的数据存储部分,例如各个模块的Mysql表的读写模型。 │ ├── food.go │ └── user.go ├── static #静态资源目录,包括Js,css,jpg等等,可以通过echo框架配置,直接让用户访问。 │ ├── css │ ├── images │ └── js ├── logs #日志文件目录,主要保存项目运行过程中产生的日志。 └── views #视图模板目录,存放各个模块的视图模板,当然有些项目只有api,是不需要视图部分,可以忽略这个目录 └── index.html
上面给出的项目结构,程序编译打包后代码都编译成一个可执行程序,我们需要把 conf,static, logs 目录一起打包部署,否则程序会找不到配置文件,静态文件,日志存储目录。
5. 路由控制器
1)路由
echo 框架的路由定义如下:
// 定义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)
2)控制器
在 echo 框架中,控制器是一个函数,我们需要根据业务实现各种控制器函数,控制器函数定义如下:
// 控制器函数只接受一个 echo.Context 上下文参数 // 参数:c 是上下文参数,关联了当前请求和响应,通过 c 参数我们可以获取请求参数,向客户端响应结果。 func HandlerFunc(c echo.Context) error
例子:
// 路由定义:e.GET("/users/:id", getUser) // getUser控制器函数实现 func getUser(c echo.Context) error { // 获取url上的path参数,url模式里面定义了参数:id id := c.Param("id") //响应一个字符串,这里直接把id以字符串的形式返回给客户端。 return c.String(http.StatusOK, id) }
6. echo 如何获取请求参数
控制获取请求参数的例子:
func getUser(c echo.Context) error { // 方式1:获取url上的path参数,url模式里面定义了参数:id id := c.Param("id") //方式2:获取query参数,例如:/users?username=tizi365&type=2 username := c.QueryParam("username") //值为:"tizi365" usertype := c.QueryParam("type") //值为:"2" //方式3:获取post请求的表单参数 username := c.FormValue("username") usertype := c.FormValue("type") return c.String(http.StatusOK, "获取参数例子") }
7. 响应请求
echo 框架支持以文本、html、Json、xml 多种格式的内容形式响应 Http 请求。
控制器响应请求的例子:
type User struct { Id int Username string } func getUser(c echo.Context) error { // 方式1: 返回字符串 // 以字符串的形式返回,c.String语法:c.String(http状态码,"字符串内容") return c.String(http.StatusOK, "获取参数例子") // 方式2:返回JSON // 以json字符串的形式返回结果,c.JSON语法: c.JSON(http状态码, 结构体变量) u := User{2, "tizi365"} return c.JSON(http.StatusOK, u) //返回结果:{"id":2,"username":"tizi365"} // 方式3: 返回HTML // 以网页形式返回html代码,c.HTML语法: c.HTML(http状态码, "html内容") html := "<html><head><title>tizi365.com</title></head><body>欢迎访问tizi365.com</body></html>" // 当然实际项目,我们不会这样拼写html代码,太麻烦,我们一会使用模板引擎处理Html代码,然后把结果通过c.HTML返回给客户端就行。 return c.HTML(http.StatusOK, html) }
8. 如何展示静态内容
对于 js、css、png、jpg 这些静态内容,echo 框架通过一个配置就可以实现静态资源的展示。
例子:
e := echo.New() // ...忽略其他初始化代码... // 设置静态资源url前缀和目录 // 这里设置 /static 为静态资源 url 的前缀,当前程序运行目录下面的 static 目录为静态资源目录 e.Static("/static", "static") // 例如:static 目录下存在 js/index.js 文件, 则这个 js 的 url 为:/static/js/index.js
路由是一个过程,指的是一个 http 请求,如何找到对应的控制器函数或者叫处理器函数。控制器函数主要负责执行 http 请求-响应任务。根据 MVC 设计模式,控制器不会把所有的请求-响应任务都干了,控制只是作为一个请求的入口、起到协调(调用各个模块)的作用。