Echo 框架的简单使用
本文是工作刚接触 go 语言,需要作分享时做的一份总结,重新整理的结果。
特性概述
总的来说:轻量·高效
-
优化的 HTTP 路由器,巧妙地确定路由优先级
-
构建健壮且可伸缩的 RESTful API
-
组 API
-
可扩展的中间件框架
-
以根,组或路径级别定义中间件
-
JSON,XML 和表单的数据绑定
-
便捷地发送各种 HTTP 响应
-
集中的 HTTP 错误处理
-
可以使用任何模板引擎
-
自定义 logger
-
高度可定制
-
从 Let’s Encrypt(第三方网站)自动加载 TLS
-
HTTP / 2 支持
简单例子:helloworld
package main
import (
"net/http"
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
)
func main() {
//创建 echo 对象
e := echo.New()
//中间件
e.Use(middleware.Logger())
e.Use(middleware.Recover())
//路由 route 映射 handler(函数)
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!\n")
})
// 启动服务 (绑定 ip: port)
e.Logger.Fatal(e.Start(":1323"))
}
- 启动后访问 http://localhost:1323 ,即可见效果
- 可能无法访问,公司的代理服务器需要配置一下:
- 网络-》代理-》勾选 “请勿将代理服务器用于本地(Intranet)地址”
Context
- 功能:接受请求 Request—处理—返回相应 Response
- echo.Context 代表了当前 HTTP 请求的 context(上下文?这里看个人理解吧,就不翻译了)。 它含有请求和相应的引用,路径,路径参数,数据,注册的业务处理方法和读取请求和输出响应的 API。
- 由于 Context 是一个接口,所以也可以很方便的使用自定义的 API 扩展。
常用 API
-
请求 响应对象
Request() *http.Request Response() *Response
-
从 request 获取参数
Param(name string) string ParamNames() []string ParamValues() []string
QueryParam(name string) string FormParams() (url.Values, error)
3.cookie 配合标准库 http.Cookie 使用
Cookie(name string) (*http.Cookie, error)
SetCookie(cookie *http.Cookie)
Cookies() []*http.Cookie
-
响应
String(code int, s string) error
HTML(code int, html string) error HTMLBlob(code int, b []byte) error
JSON(code int, i interface{}) error JSONPretty(code int, i interface{}, indent string) error JSONBlob(code int, b []byte) error
XML(code int, i interface{}) error XMLPretty(code int, i interface{}, indent string) error XMLBlob(code int, b []byte) error
Blob(code int, contentType string, b []byte) error Stream(code int, contentType string, r io.Reader) error File(file string) error
- 源码:echo.context
路由映射
-
路由可以通过特定的 HTTP 方法, url 路径和一个匹配的 handler 来注册。
-
用法: 方法(路径,handler,<中间件>)
-
rest API 示例(restful 范式):
方法 | restful 操作 | http 响应结果 |
---|---|---|
e.POST("/users", createUser) | Create | 201 Created |
e.GET("/users/:id", getUser) | Retrieve | 200 OK |
e.PUT("/users/:id",updateUser) | Update | 200 OK |
e.DELETE("/users/:id", deleteUser) | Delete | 204 NotContent Create 201 Created |
- 源码:echo.echo
路径匹配顺序(按下表从上到下的顺序匹配)
分类 | url | 特点 |
---|---|---|
Static (固定路径) | /users/new | 固定,唯一 |
Param (参数路径) | /users/:id | :id 参数 |
Match any (匹配所有) | /users/1/files/* | *通配符 所有 |
组路由:
- 特点:相同的前缀
- 功能:分类,批量处理
静态文件
- 图片,JavaScript,CSS,PDF,字体文件等等…
- 专门创造一个目录保存这些文件
- 配置:
e := echo.New()
e.Static("/static", "assets") // 将所有访问 /static/* 的请求去访问 assets 目录。
// 例如, 一个访 问 /static/js/main.js 的请求会匹配到
// assets/js/main.js 这个文件
- 模板渲染
配合标准库 html/template
Render(code int, name string, data interface{}) error 用于渲染一个模板,然后发送一个 text/html 的状态响应。
我们可以使用任何模板引擎,只要赋值给 Echo.Renderer
代码示例:
package main
import "os"
import "html/template"
type Inventory struct {
Material string
Count uint
}
func main() {
sweaters := Inventory{"wool", 17}
tmpl, err := template.New("test").Parse("{{.Count}} of {{.Material}}")
if err != nil {
panic(err)
}
err = tmpl.Execute(os.Stdout, sweaters)
if err != nil {
panic(err)
}
// out
输出:17 of wool
- 原文作者:战神西红柿
- 原文链接:https://tomatoares.github.io/posts/web/echo/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。