云原生学习路线导航页(持续更新中)
本文是golang语言系列文章,本篇主要对 Echo 框架 的基本使用方法 进行学习
1.Echo是什么
- Go 有众多Web框架,Echo 是其中的一个,官网介绍Echo有高性能、可扩展性、极简的特点。使用Echo可以快速开发一个Web应用
- 官网:https://echo.labstack.com/
- 官方文档:https://echo.labstack.com/docs/quick-start
- 官方文档写的很好,虽然是英文,但是通俗易懂,建议大家直接看文档学习
- github仓库:https://github.com/labstack/echo
- 推荐博客:https://www.cnblogs.com/remixnameless/category/1921316.html
- Echo官方描述的众多特性
- 优化 HTTP 路由器,智能优先路由
- 构建健壮且可伸缩的 RESTful API
- 具有群组 API
- 可扩展的中间件框架
- 可以在根、组或路由级别定义中间件
- JSON、 XML 和表单有效负载的数据绑定
- 发送各种 HTTP 响应的方便函数
- 集中式 HTTP 错误处理
- 使用任意模板引擎进行模板呈现
- 定义日志记录器的格式
- 高度可定制
- 自动 TLS 加密
- HTTP/2支持
2.Echo使用快速入门
2.1.Echo安装
- Echo 的安装需要有go环境,Go 1.13或更高版本。
- Echo 对 Go 1.12的支持有限,一些中间件将不可用
$ mkdir myapp && cd myapp $ go mod init myapp # Go v1.15及以上,安装命令 $ go get github.com/labstack/echo/v4 # Go v1.14及以下,安装命令 GO111MODULE=on go get github.com/labstack/echo/v4
2.2.编写Hello, World!
- 创建 server.go 文件
package main import "github.com/labstack/echo/v4" func main() { e := echo.New() e.GET("/", func(c echo.Context) error { return c.String(200, "Hello, World!") }) e.Logger.Fatal(e.Start(":1323")) }
- 启动服务
go run server.go
- 在浏览器访问
http://localhost:1323
,输出如下
2.3.CRUD方法的路由设置
e.POST("/users", saveUser)
e.GET("/users/:id", getUser)
e.PUT("/users/:id", updateUser)
e.DELETE("/users/:id", deleteUser)
2.4.获取请求参数
2.4.1.路径参数的获取
- 使用
c.Param
,传入名称,可以获取路径参数 - 演示接口:
GET /user/:id
package main import "github.com/labstack/echo/v4" func main() { e := echo.New() e.GET("/", func(c echo.Context) error { return c.String(200, "Hello, World!") }) e.GET("/user/:id", getUser) e.Logger.Fatal(e.Start(":1323")) } func getUser(c echo.Context) error { id := c.Param("id") return c.String(200, "user id:"+id) }
- 测试
2.4.2.查询参数的获取
- 使用
c.QueryParam
,传入名称,可以获取查询参数 - 演示接口:
GET /user
package main import "github.com/labstack/echo/v4" func main() { e := echo.New() e.GET("/user", getQueryParam) e.Logger.Fatal(e.Start(":1323")) } func getQueryParam(c echo.Context) error { id := c.QueryParam("id") name := c.QueryParam("name") return c.String(200, "user id:"+id+" name:"+name) }
- 测试
2.4.3.表单数据的获取
- Post请求的两种编码格式:
application/x-www-form-urlencoded
:multipart/form-data
2.4.3.1.Form application/x-www-form-urlencoded
- 使用
c.FormValue
,传入名称,可以获取表单指定参数的值 - 演示接口:
POST /user
package main import ( "github.com/labstack/echo/v4" "net/http" ) func main() { e := echo.New() e.POST("/user", save) e.Logger.Fatal(e.Start(":1323")) } func save(c echo.Context) error { // Get name and email name := c.FormValue("name") email := c.FormValue("email") return c.String(http.StatusOK, "name:"+name+", email:"+email) }
- 测试
curl -d "name=Joe Smith" -d "email=joe@labstack.com" http://localhost:1323/user // => name:Joe Smith, email:joe@labstack.com
2.4.3.2.Form multipart/form-data
-
上传文件,一般使用Form multipart/form-data
-
演示接口:
POST /userAvatar
package main import ( "github.com/labstack/echo/v4" "io" "net/http" "os" ) func main() { e := echo.New() e.POST("/userAvatar", saveAvatar) e.Logger.Fatal(e.Start(":1323")) } func saveAvatar(c echo.Context) error { // Get name name := c.FormValue("name") // Get avatar:avatar传过来的是本地文件路径 avatar, err := c.FormFile("avatar") if err != nil { return err } // Source(因为都是localhost,直接打开本地文件就行) src, err := avatar.Open() if err != nil { return err } defer src.Close() // Destination dst, err := os.Create(avatar.Filename) if err != nil { return err } defer dst.Close() // Copy if _, err = io.Copy(dst, src); err != nil { return err } return c.HTML(http.StatusOK, "<b>Thank you! "+name+"</b>") }
-
测试
curl -F "name=Joe Smith" -F "avatar=@/path/to/your/avatar.png" http://localhost:1323/userAvatar // => <b>Thank you! Joe Smith</b>
2.5.4.参数绑定
- 根据 Content-Type 请求头将 json、 xml、表单或查询有效负载绑定到 Go struct 中。
- 使用状态代码,将响应呈现为 json 或 xml
package main import ( "github.com/labstack/echo/v4" "io" "net/http" "os" ) type User struct { Name string `json:"name" xml:"name" form:"name" query:"name"` Email string `json:"email" xml:"email" form:"email" query:"email"` } func main() { e := echo.New() e.POST("/users", users) e.Logger.Fatal(e.Start(":1323")) } func users(c echo.Context) error { u := new(User) if err := c.Bind(u); err != nil { return err } return c.JSON(http.StatusCreated, u) // or // return c.XML(http.StatusCreated, u) }
2.5.中间件
- echo提供的中间件很多,需要的时候查就行
- 下面演示
middleware.Logger()、middleware.Recover()
中间件、自定义基础认证中间件方法、自定义接口响应后路由中间件 的使用
// Root level middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())
// Group level middleware
g := e.Group("/admin")
g.Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
if username == "joe" && password == "secret" {
return true, nil
}
return false, nil
}))
// Route level middleware
track := func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
println("request to /users")
return next(c)
}
}
e.GET("/users", func(c echo.Context) error {
return c.String(http.StatusOK, "/users")
}, track)
2.5.静态内容和渲染Render
e.Static("/static", "static")
- static content 更多详细内容,请参考:
- https://echo.labstack.com/docs/static-files
- Render更多详细内容,请参考:
- https://echo.labstack.com/docs/templates