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

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

4.响应

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 这个文件
    

6.模板渲染

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