清风徐来
Michael's Blog
golang echo 入门

#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 / jsonapplication / 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 / xml curl -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