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 mainimport "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 mainimport "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 mainimport "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 mainimport ("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 emailname := 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 mainimport ("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 namename := 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()// Destinationdst, err := os.Create(avatar.Filename)if err != nil {return err}defer dst.Close()// Copyif _, 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 mainimport ("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")
  • static content 更多详细内容,请参考:
    • https://echo.labstack.com/docs/static-files
  • Render更多详细内容,请参考:
    • https://echo.labstack.com/docs/templates

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/588224.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Object类的方法-clone() \ finalize()

了解方法&#xff1a;clone() \ finalize()根据JDK源代码及Object类的API文档&#xff0c;Object类当中包含的方法有11个。这里我们主要关注其中的6个&#xff1a; clone() //Object类的clone()的使用 public class CloneTest { public static void main(String[] args) { …

关于ITIL认证您需要了解的一切

这是一篇关于从业人员、领导者和 ITSM 爱好者指南。ITIL4于2019 年发布。最新版本的 IT 服务管理&#xff08;ITSM&#xff09;最佳实践从传统的生命周期方法转变为服务价值体系模型&#xff0c;重点关注价值共创、向业务交付成果以及与其他最佳实践框架的融合。 新版本的框架…

【教程】Kotlin语言学习笔记(五)——Lambda表达式与条件控制

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 第三章 《数据容器》 第四章 《方法》 第五章 《L…

Redission--布隆过滤器解决缓存穿透问题

布隆过滤器在缓存穿透问题中的使用 布隆过滤器的核心是一个位数组 布隆过滤器的误判 使用Redission的布隆过滤器步骤 添加 Redission 依赖&#xff1a;首先需要将 Redission 添加到你的 Java 项目中&#xff0c;你可以通过 Maven 来添加 Redission 的依赖。 创建 Redissio…

GT收发器PHY层设计(2)GT_module模块设计

文章目录 前言一、设计框图二、例化IP核端口三、common_reset_i模块四、gt_usrclk_source模块五、IBUFDS_GTE2和gtwizard_0_common模块六、顶层模块gt_module总结 前言 根据官方的example design设计一个自定义协议的高速PHY设计 一、设计框图 设计思路及代码思路参考FPGA奇哥…

九州未来深度参与元宇宙标准会议周

近日&#xff0c;元宇宙标准化工作组成立大会暨第一次全体委员会会议在浙江青田成功举办。本次会议由元宇宙标准化工作组主办&#xff0c;中国电子技术标准化研究院、中共青田县委 青田县人民政府承办&#xff0c;涵盖了《元宇宙参考架构》国家标准编制会、《工业元宇宙参考架构…

AI音乐GPT时刻来临:Suno 快速入门手册!

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

铸铁平台划线基准的基本操作——泊头市北重厂家

划线基准是指在铸铁平台上划定一条直线或直角线&#xff0c;用作测量和定位的参考线。下面是铸铁平台划线基准的操作步骤&#xff1a; 准备工具和材料&#xff1a;铸铁平台、直尺、铅笔或划线笔、胶带等。 清洁铸铁平台&#xff1a;使用清洁布或刷子清除铸铁平台表面的尘土和杂…

MySQL 中将使用逗号分隔的字段转换为多行数据

在我们的实际开发中&#xff0c;经常需要存储一些字段&#xff0c;它们使用像, - 等连接符进行连接。在查询过程中&#xff0c;有时需要将这些字段使用连接符分割&#xff0c;然后查询多条数据。今天&#xff0c;我们将使用一个实际的生产场景来详细解释这个解决方案。 场景介绍…

WebGIS 地铁交通线网数据可视化监控平台

数字孪生技术在地铁线网的管理和运维中的应用是一个前沿且迅速发展的领域。随着物联网、大数据、云计算以及人工智能技术的发展&#xff0c;地铁线网数字孪生在智能交通和智慧城市建设中的作用日益凸显。 图扑软件基于 HTML5 的 2D、3D 图形渲染引擎&#xff0c;结合 GIS 地图&…

c++ 插值搜索-迭代与递归(Interpolation Search)

给定一个由 n 个均匀分布值 arr[] 组成的排序数组&#xff0c;编写一个函数来搜索数组中的特定元素 x。 线性搜索需要 O(n) 时间找到元素&#xff0c;跳转搜索需要 O(? n) 时间&#xff0c;二分搜索需要 O(log n) 时间。 插值搜索是对实例二分搜索的改进&#xff0c;…

LC 110.平衡二叉树

110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1&#xff1a; 输入&#xff1a; root [3,9,20,null,null,15,7]…