#golang echo 入门
##概要 go web framework echo的入门教程
##环境
- macOS 10.14.4
- golang 1.11.5
- echo 4.0.0
##安装
go get -u github.com/labstack/echo/...
##入门
mkdir $GOPATH/src/github.com/kissjava/echo_test
code $GOPATH/src/github.com/kissjava/echo_test/main.go
main.go
package main
import (
"github.com/labstack/echo"
"net/http"
)
func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
})
e.Logger.Fatal(e.Start(":1323"))
}
以下开始进行:格式化、编译、运行、访问测试
go fmt github.com/kissjava/echo_test
go build github.com/kissjava/echo_test
./echo_test
curl localhost:1323
应该可以在终端返回“Hello,World!”
###提示 在官方的Github上,按README.md示例运行时,很可能无法正常运行
##路由 按你的喜好添加一些路由进去
package main
import (
"github.com/labstack/echo"
"net/http"
)
func getHandler(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
}
func hogeHandler(c echo.Context) error {
return c.String(http.StatusOK, c.Param("path"))
}
func main() {
e := echo.New()
e.GET("/", getHandler)
e.GET("/hoge/:path", hogeHandler)
e.Logger.Fatal(e.Start(":1323"))
}
可以使用e.GET添加更多的内容。
c.Param可以访问URL信息
测试一下
curl localhost:1323/hoge/fuga
##获取查询参数
我们刚刚通过c.Param拿到了URL
现在再来获取一下查询参数
package main
import (
"github.com/labstack/echo"
"net/http"
)
func getHandler(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
}
func hogeHandler(c echo.Context) error {
return c.String(http.StatusOK, c.QueryParam("key"))
}
func main() {
e := echo.New()
e.GET("/", getHandler)
e.GET("/hoge", hogeHandler)
e.Logger.Fatal(e.Start(":1323"))
}
测试一下
curl localhost:1323/hoge?key=value
顺便说一下,当从WebUI等接收表单信息时,使用c.FormValue
##返回HTML 上代码
package main
import (
"fmt"
"github.com/labstack/echo"
"net/http"
)
func htmlHandler(c echo.Context) error {
return c.HTML(http.StatusOK, fmt.Sprintf("<h1>Hello %s</h1>", c.Param("name")))
}
func main() {
e := echo.New()
e.GET("/:name", htmlHandler)
e.Logger.Fatal(e.Start(":1323"))
}
使用c.HTML创建HTML响应,响应头Content-Type是text / html; charset = UTF-8
##支持多种内容类型
例如,您可以定义一个可以同时处理application / json和application / xml的处理程序
type User struct {
Name string `json:"name" xml:"name" form:"name" query:"name"`
Age Int `json:"age" xml:"age" form:"age" query:"age"`
}
e.POST("/users", func(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)
})
application / json可以按如下方式发送curl -v -XPOST -H 'Content-Type: application/json' -d '{"name":"mike","age":10}' localhost:1323- 如果是
application / xmlcurl -v -XPOST -H 'Content-Type: application/xml' -d '<User><name>mike</name><age>20</age></User>' localhost:1323能够使用一个处理程序处理多种媒体类型很方便
##提供静态文件 先建立一个文件夹,把icon.png放入
mkdir public
cp icon.png public
编辑main.go
package main
import (
"github.com/labstack/echo"
)
func main() {
e := echo.New()
e.Static("/img", "./public")
e.Logger.Fatal(e.Start(":1323"))
}
使用e.Static搞定,http路径是/img/*的静态文件都可以放入到public下
##中间件 丰富的中间件功能可以轻松实现日志记录和身份验证 可以在before/after等情况下处理。
package main
import (
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
"net/http"
)
func main() {
e := echo.New()
// logging
e.Use(middleware.Logger())
e.Use(middleware.Recover())
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)
// basic auth
g := e.Group("/admin")
g.Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
if username == "kissjava" && password == "secret" {
return true, nil
}
return false, nil
}))
g.GET("/users", func(c echo.Context) error {
return c.String(http.StatusOK, "/admin/users")
}, track)
e.Logger.Fatal(e.Start(":1323"))
}
以上是日志记录和基本身份验证的示例实现
首先是日志(Logging)记录,基本上我们想要将记录应用于任何请求,因此将全局设置放在e.Use(middleware.Logger())中。如果你想单独处理每个路由,如果你指定一个带有func(next echo.HandlerFunc)echo.HandlerFunc的函数作为e.GET的最后一个参数,它将在请求之前被处理。
接下来是基本认证
使用middleware.BasicAuth
身份验证成功返回true, nil,如果失败就是false, nil,则返回{“message”:“Unauthorized”}
以上,基本认证适用于Group,也就是g.GET打头的路由。
##最后 作为后端的API应用差不多够用了。少了模板处理和错误处理,后期涉及到时再补充。
最后修改于 2019-08-15