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")
  • static content 更多详细内容,请参考:
    • https://echo.labstack.com/docs/static-files
  • Render更多详细内容,请参考:
    • https://echo.labstack.com/docs/templates

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java发送请求-cookie有关代码

在初始化后添加cookie的代码 用这个httpclients类调custom方法&#xff0c;进行代码定制化 找和cookie有关的方法&#xff0c;设置默认的cookie存储信息 入参是接口 将入参粘贴后找方法&#xff0c;用new实现这个接口 这个方法是无参空构造&#xff0c;可以使用 设置了cookie …

【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案

【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案 大家好 我是寸铁&#x1f44a; 总结了一篇【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天在登录redis时&#xff0c…

入门级深度学习主机组装过程

一 配置 先附上电脑配置图&#xff0c;如下&#xff1a; 利用公司的办公电脑对配置进行升级改造完成。除了显卡和电源&#xff0c;其他硬件都是公司电脑原装。 二 显卡 有钱直接上 RTX4090&#xff0c;也不能复用公司的电脑&#xff0c;其他配置跟不上。 进行深度学习&…

路由和远程访问是什么?

路由和远程访问在现代互联网时代中&#xff0c;扮演着至关重要的角色。它们为我们提供了便捷的信息传递途径&#xff0c;让不同地区的电脑、设备以及人们之间能够轻松进行通信和交流。 对于路由来说&#xff0c;它是连接互联网上的各个网络的核心设备。一台路由器可以将来自不同…

2013年认证杯SPSSPRO杯数学建模B题(第二阶段)流行音乐发展简史全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 B题 流行音乐发展简史 原题再现&#xff1a; 随着互联网的发展&#xff0c;流行音乐的主要传播媒介从传统的电台和唱片逐渐过渡到网络下载和网络电台等。网络电台需要根据收听者的已知喜好&#xff0c;自动推荐并播放其它音乐。由于每个人喜好…

CCIE-03-Layer2-LAN-TS

目录 实验条件网络拓朴实验目标 开始排错问题1. SW2上的DHCP中继没有配置正确问题2. SW1/SW2的SVI接口被关闭问题3. 安全端口配置了不同的MAC地址 实验条件 网络拓朴 Output1 Output2 实验目标 排除故障使得PC101访问Server1时符合图片中给出的Output 开始排错 根据要求…

认识什么是Webpack

目录 1. 认识Webpack 1.1. 什么是Webpack?&#xff08;定义&#xff09; 1.2. 使用Webpack 1.2.1. 需求 1.2.2. 步骤 1.3. 入口和出口默认值 1.3.1. 需求代码如下 2. 修改Webpack打包入口和出口 2.1. 步骤&#xff1a; 2.2. 注意 3. Webpack自动生成html文件 3.1.…

NPW(监控片的)的要点精讲

半导体的生产过程已经历经数十年的发展&#xff0c;其中主要有两个大的发展趋势&#xff0c;第一&#xff0c;晶圆尺寸越做越大&#xff0c;到目前已有超过70%的产能是12寸晶圆&#xff0c;不过18寸晶圆产业链推进缓慢&#xff1b;第二&#xff0c;电子器件的关键尺寸越做越小&…

VLAN间路由

部署了VLAN的传统交换机不能实现不同VLAN间的二层报文转发&#xff0c;因此必须引入路由技术来实现不同VLAN间的通信。VLAN路由可以通过二层交换机配合路由器来实现&#xff0c;也可以通过三层交换机来实现&#xff1b; VLAN间通讯限制 每个VLAN都是一个独立的广播域&#xff…

ubuntu-server部署hive-part1-安装jdk

参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本&#xff1a;ubuntu-server-22.04.3 虚拟机&#xff1a;virtualbox7.0 安装jdk 上传解压 以root用户&#xff0c;将jdk上传至/opt目录下 tar zxvf jdk-8u271-linux-x64.tar.gz 配置环境变量…

LLM - 大语言模型 基于人类反馈的强化学习(RLHF)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/137269049 基于人类反馈的强化学习(RLHF,Reinforcement Learning from Human Feedback),结合 强化学习(RL) 和 人类反馈 来优化模型的性能。这种方法主要包…

多态--下

文章目录 概念多态如何实现的指向谁调谁&#xff1f;例子分析 含有虚函数类的大小是多少&#xff1f;虚函数地址虚表地址多继承的子类的大小怎么计算&#xff1f;练习题虚函数和虚继承 概念 优先使用组合、而不是继承; 继承会破坏父类的封装、因为子类也可以调用到父类的函数;…

【OpenCV】图像像素的遍历

1 前言 介绍两种遍历像素的方法&#xff08;非指针、指针&#xff09;。注意&#xff1a;.at() .ptr()的作用、用法。相关API&#xff1a; Mat对象.ptr() Mat对象.at() 2 代码及内容 #include "iostream" #include "opencv2/opencv.hpp"using namespac…

知识图谱简介:探索知识的宇宙

知识图谱简介&#xff1a;探索知识的宇宙 一、引言 在这个由数据驱动的世界里&#xff0c;信息呈现出爆炸式的增长&#xff0c;人们对于管理和利用这些庞大数据量的需求也随之增长。知识图谱以其独特的方式&#xff0c;成为了整合和利用这些信息的有力工具。它不仅有助于组织杂…

小象超市(原美团买菜) 的大屏图表

文章目录 概要技术细节技术名词解释小结 概要 20203年12月1日&#xff0c;美团旗下自营零售品牌“美团买菜”升级为全新品牌“小象超市”。 &#xff0c;“小象超市”坚持美团自营零售模式&#xff0c;通过在社区设立的集存储、分拣、配送为一体的便民服务站&#xff0c;为社区…

ES8 学习 -- async 和 await / 对象方法扩展 / 字符串填充

文章目录 1. async 和 await1.1 基本语法1.2 使用示例1.3 案例练习 2. 对象方法扩展2.1 Object.values(obj)2.2 Object.entries(obj)2.3 Object.getOwnPropertyDescriptors(obj)使用示例 3. 字符串填充4. 函数参数的末尾加逗号 1. async 和 await async 函数&#xff0c;使得异…

Android Studio学习10——资源res的使用

一、String,StringArray的使用 一次修改&#xff0c;多出生效 String StringArray 二、color的使用 颜色代码对应表 和上面的相似用法 三、Dimen(尺寸)的使用 用的少&#xff0c;一般直接写尺寸 四、如何写一个drawable作为背景 五、如何写一个可以改变的drawable(按钮按下…

【合合TextIn】OCR身份证 / 银行卡识别功能适配鸿蒙系统

目录 一、 鸿蒙系统与信创国产化的背景 二、两款产品的兼容性升级详情 三、身份证产品介绍 四、银行卡识别产品 五、承诺与展望 一、 鸿蒙系统与信创国产化的背景 自鸿蒙系统推出以来&#xff0c;其不仅成为了华为在软件领域的重要里程碑&#xff0c;更是国产操作系统的一…

redis的键值基本操作

设置数据 首先设置键值对 删除age&#xff0c;会得到nil&#xff0c;表示这个键已经被删除掉了 判断age键还在不在 查找所有键 查找所有以me结尾的键 删除所有键 redis的键和值都是二进制存储的&#xff0c;所以默认不支持中文。 但是&#xff0c;我们重新登录客户端&#xff…

Java 变得越来越像 Rust?

随着编程技术的增强和复杂性的提升&#xff0c;许多编程语言也纷纷效仿&#xff0c;Java 也不例外。 另一边&#xff0c;尽管社区内部问题重重&#xff0c;但 Rust 仍逐年获得开发人员的喜爱。这背后都是有原因的&#xff1a;Rust 的编译器让开发人员避免了各种问题。编译器对…