golang语言系列:Web框架+路由 之 Echo

云原生学习路线导航页(持续更新中)

本文是golang语言系列文章,本篇主要对 Echo 框架 的基本使用方法 进行学习

1.Echo是什么

  • Go 有众多Web框架,Echo 是其中的一个,官网介绍Echo有高性能、可扩展性、极简的特点。使用Echo可以快速开发一个Web应用
  • 官网:https://echo.labstack.com/
  • 官方文档:https://echo.labstack.com/docs/quick-start
    • 官方文档写的很好,虽然是英文,但是通俗易懂,建议大家直接看文档学习
  • github仓库:https://github.com/labstack/echo
  • 推荐博客:https://www.cnblogs.com/remixnameless/category/1921316.html
  • Echo官方描述的众多特性
    • 优化 HTTP 路由器,智能优先路由
    • 构建健壮且可伸缩的 RESTful API
    • 具有群组 API
    • 可扩展的中间件框架
    • 可以在根、组或路由级别定义中间件
    • JSON、 XML 和表单有效负载的数据绑定
    • 发送各种 HTTP 响应的方便函数
    • 集中式 HTTP 错误处理
    • 使用任意模板引擎进行模板呈现
    • 定义日志记录器的格式
    • 高度可定制
    • 自动 TLS 加密
    • HTTP/2支持

2.Echo使用快速入门

2.1.Echo安装

  • Echo 的安装需要有go环境,Go 1.13或更高版本。
  • Echo 对 Go 1.12的支持有限,一些中间件将不可用
    $ mkdir myapp && cd myapp
    $ go mod init myapp
    
    # Go v1.15及以上,安装命令
    $ go get github.com/labstack/echo/v4
    
    # Go v1.14及以下,安装命令
    GO111MODULE=on go get github.com/labstack/echo/v4
    

2.2.编写Hello, World!

  • 创建 server.go 文件
    package main
    
    import "github.com/labstack/echo/v4"
    
    func main() {
    	e := echo.New()
    	e.GET("/", func(c echo.Context) error {
    		return c.String(200, "Hello, World!")
    	})
    	e.Logger.Fatal(e.Start(":1323"))
    }
    
  • 启动服务
    go run server.go
    
  • 在浏览器访问 http://localhost:1323,输出如下
    在这里插入图片描述

2.3.CRUD方法的路由设置

e.POST("/users", saveUser)
e.GET("/users/:id", getUser)
e.PUT("/users/:id", updateUser)
e.DELETE("/users/:id", deleteUser)

2.4.获取请求参数

2.4.1.路径参数的获取

  • 使用 c.Param,传入名称,可以获取路径参数
  • 演示接口:GET /user/:id
    package main
    
    import "github.com/labstack/echo/v4"
    
    func main() {
    	e := echo.New()
    	e.GET("/", func(c echo.Context) error {
    		return c.String(200, "Hello, World!")
    	})
    	e.GET("/user/:id", getUser)
    	e.Logger.Fatal(e.Start(":1323"))
    }
    
    func getUser(c echo.Context) error {
    	id := c.Param("id")
    	return c.String(200, "user id:"+id)
    }
    
  • 测试
    在这里插入图片描述

2.4.2.查询参数的获取

  • 使用 c.QueryParam,传入名称,可以获取查询参数
  • 演示接口:GET /user
    package main
    
    import "github.com/labstack/echo/v4"
    
    func main() {
    	e := echo.New()
    	e.GET("/user", getQueryParam)
    	e.Logger.Fatal(e.Start(":1323"))
    }
    
    func getQueryParam(c echo.Context) error {
    	id := c.QueryParam("id")
    	name := c.QueryParam("name")
    	return c.String(200, "user id:"+id+" name:"+name)
    }
    
  • 测试
    在这里插入图片描述

2.4.3.表单数据的获取

  • Post请求的两种编码格式:
    • application/x-www-form-urlencoded
    • multipart/form-data
2.4.3.1.Form application/x-www-form-urlencoded
  • 使用 c.FormValue,传入名称,可以获取表单指定参数的值
  • 演示接口:POST /user
    package main
    
    import (
    	"github.com/labstack/echo/v4"
    	"net/http"
    )
    
    func main() {
    	e := echo.New()
    	e.POST("/user", save)
    	e.Logger.Fatal(e.Start(":1323"))
    }
    
    func save(c echo.Context) error {
    	// Get name and email
    	name := c.FormValue("name")
    	email := c.FormValue("email")
    	return c.String(http.StatusOK, "name:"+name+", email:"+email)
    }
    
  • 测试
    curl -d "name=Joe Smith" -d "email=joe@labstack.com" http://localhost:1323/user
    // => name:Joe Smith, email:joe@labstack.com
    
2.4.3.2.Form multipart/form-data
  • 上传文件,一般使用Form multipart/form-data

  • 演示接口:POST /userAvatar

    package main
    
    import (
       "github.com/labstack/echo/v4"
       "io"
       "net/http"
       "os"
    )
    
    func main() {
       e := echo.New()
       e.POST("/userAvatar", saveAvatar)
       e.Logger.Fatal(e.Start(":1323"))
    }
    
    func saveAvatar(c echo.Context) error {
       // Get name
       name := c.FormValue("name")
       // Get avatar:avatar传过来的是本地文件路径
       avatar, err := c.FormFile("avatar")
       if err != nil {
       	return err
       }
    
       // Source(因为都是localhost,直接打开本地文件就行)
       src, err := avatar.Open()
       if err != nil {
       	return err
       }
       defer src.Close()
    
       // Destination
       dst, err := os.Create(avatar.Filename)
       if err != nil {
       	return err
       }
       defer dst.Close()
    
       // Copy
       if _, err = io.Copy(dst, src); err != nil {
       	return err
       }
    
       return c.HTML(http.StatusOK, "<b>Thank you! "+name+"</b>")
    }
    
  • 测试

    curl -F "name=Joe Smith" -F "avatar=@/path/to/your/avatar.png" http://localhost:1323/userAvatar
    // => <b>Thank you! Joe Smith</b>
    

2.5.4.参数绑定

  • 根据 Content-Type 请求头将 json、 xml、表单或查询有效负载绑定到 Go struct 中。
  • 使用状态代码,将响应呈现为 json 或 xml
    package main
    
    import (
    	"github.com/labstack/echo/v4"
    	"io"
    	"net/http"
    	"os"
    )
    
    type User struct {
    	Name  string `json:"name" xml:"name" form:"name" query:"name"`
    	Email string `json:"email" xml:"email" form:"email" query:"email"`
    }
    
    func main() {
    	e := echo.New()
    	e.POST("/users", users)
    	e.Logger.Fatal(e.Start(":1323"))
    }
    
    func users(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)
    }
    

2.5.中间件

  • echo提供的中间件很多,需要的时候查就行
  • 下面演示 middleware.Logger()、middleware.Recover() 中间件、自定义基础认证中间件方法、自定义接口响应后路由中间件 的使用
// Root level middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())

// Group level middleware
g := e.Group("/admin")
g.Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
  if username == "joe" && password == "secret" {
    return true, nil
  }
  return false, nil
}))

// Route level middleware
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)

2.5.静态内容和渲染Render

e.Static("/static", "static")

相关推荐

  1. Web框架开发-Django的层(URLconf)

    2024-04-03 08:54:03       9 阅读

最近更新

  1. Android 混淆模板

    2024-04-03 08:54:03       0 阅读
  2. redis常用5大数据类型

    2024-04-03 08:54:03       0 阅读
  3. 深度学习——Transformer的理解整理

    2024-04-03 08:54:03       0 阅读
  4. XiaodiSec day014 Learn Note 小迪渗透学习笔记

    2024-04-03 08:54:03       0 阅读
  5. 微信小程序

    2024-04-03 08:54:03       0 阅读

热门阅读

  1. 练气第六天

    2024-04-03 08:54:03       4 阅读
  2. openGauss 分布式分析能力

    2024-04-03 08:54:03       9 阅读
  3. PostCSS安装与使用技术详解

    2024-04-03 08:54:03       4 阅读
  4. CSS总结

    2024-04-03 08:54:03       6 阅读
  5. 拒绝服务攻击(Dos)与Tomcat的解决方法

    2024-04-03 08:54:03       6 阅读
  6. 读《C Primer Plus》

    2024-04-03 08:54:03       5 阅读
  7. Vue-前端应用开发平时作业第二章作业2

    2024-04-03 08:54:03       4 阅读
  8. Android 11 init进程对Selinux的处理

    2024-04-03 08:54:03       6 阅读