本文是工作刚接触 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

  1. 请求 响应对象

    Request() *http.Request Response() *Response

  2. 从 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
  1. 响应

    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 这个文件
  1. 模板渲染

配合标准库 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