GoLang Echo 简介

2020-03-05 Thursday     Program, GoLang, Network


echo web 框架是通过 GoLang 开发的一种高性能、可扩展、轻量级的 web 框架,只包含了 MVC 框架的 C 部分,也就是负责 URL 路由和控制器部分,对于 V 视图和 M 数据操作可以使用自己喜欢的工具库来实现。

这里简单介绍其使用方法。

echo introduce

简介

如下是一个简单的示例。

package main

import (
	"net/http"
	"github.com/labstack/echo"
)

func main() {
	e := echo.New()
	e.GET("/hello", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello World!")
	})
	e.Start(":8080")
}

使用包

这里使用 GoLang 最新的包管理工具 Modules 来维护升级 echo 框架。

static/         静态文件资源
 |-css/         CSS文件
 |-js/          JS文件
 |-html/
config/         项目配置信息
contrib/        一些常用的脚本、工具等
middleware/     中间件
model/          数据库数据模型
 |-orm/         ORM扩展
module/         模块封装
 |-auth/        Auth授权
 |-cache/       缓存
 |-session/     会话信息

路由

Echo 的路由基于 Radix Tree ,它让路由的查询非常快,而且路由使用了 Sync Pool 来重复利用内存并且几乎达到了零内存占用。

中间件

中间件是一个函数,嵌入在 HTTP 的请求和响应之间,可以获得 Echo#Context 对象用来进行一些特殊的操作, 比如记录每个请求或者统计请求数。

Action的处理在所有的中间件运行完成之后。

Pre

Pre() 用于注册一个在路由执行之前运行的中间件,可以用来修改请求的一些属性,比如在请求路径结尾添加或者删除一个 / 来使之能与路由匹配。

注意: 由于在这个级别路由还没有执行,所以这个级别的中间件不能调用任何 echo.Context 的 API。

其它

参数获取

echo 框架提供了 Bind 函数,可以直接将接收到的数据进行转换,提供了 json、xml、表单、URL 等格式的数据转换方式,也可以自己定义。

type user struct {
	UserName string `json:"username" form:"username"`
	Password string `json:"password" form:"password"`
}

func handler(c echo.Context) error {
	u := new(user)
	if err := c.Bind(u); err != nil {
		return err
	}
}

表单

HTML 提供的默认表单,可以使用如下方式。

curl -X POST http://127.1:1323/v1/hello -d 'name=Andy' -d 'email=andy@foobar.com'

在 echo 中可以通过 c.FormValue("name") 获取。

参数

在 URL 中,直接以 ?name=Andy&email=andy@foobar.com 格式提交请求,例如:

curl -X GET 'http://127.1:1323/v1/hello?name=Andy&email=andy@foobar.com'

在 echo 中可以通过 c.QueryParam("name") 获取。

JSON

也就是发送的数据为 JSON 格式。

curl -X POST http://127.1:1323/v1/hello -H 'Content-Type: application/json' \
	-d '{"name":"Andy","email":"andy@foobar.com"}'

可以通过如下方式读取并返回 JSON 数据格式。

msg, err := ioutil.ReadAll(r.Body)
if err != nil {
	return err
}

if len(msg) == 0 {
	return c.String(http.StatusOK, "Hello, World!")
}

var body map[string]interface{}
if err = json.Unmarshal(msg, &body); err != nil {
	return err
}
body["method"] = r.Method
return c.JSON(http.StatusOK, body)

参考

官网 echo.labstack.com 有很详细的示例以及文档,也可以参考中文文档 go-echo.org



如果喜欢这里的文章,而且又不差钱的话,欢迎打赏个早餐 ^_^