go-echo学习笔记

go-echo学习笔记,包含了请求与响应,路由,参数解析,模版渲染,登录验证,日志,文件上传与下载,websocket通信。

文章目录

  • Part1 Get与Post
  • Part2 四种请求
  • Part3 提取参数
  • Part4 解析json与xml
  • Part5 json传输
  • Part6 模版渲染
  • Part7 模版参数传递
  • Part8 Cookie与Session
  • Part9 JWT
  • Part9 日志
  • Part10 文件上传与下载
  • Part 11 Websocket通信

Part1 Get与Post

主要内容包括登录网页,发送请求并进行处理

import ("github.com/labstack/echo""net/http"
)func main01() {e := echo.New()e.GET("/", func(c echo.Context) error {return c.String(http.StatusOK, "<h1>Hello, World</h1>")})e.Logger.Fatal(e.Start(":1323"))
}

Part2 四种请求

包含了PUT,DELETE PUT与GET,测试的时候需要结合Postman,其中请求时,静态路由要大于参数路由大于匹配路由。


import ("github.com/labstack/echo""net/http"
)func HelloFunc(c echo.Context) error {return c.String(http.StatusOK, "Hello, World!")
}func UserHandler(c echo.Context) error {return c.String(http.StatusOK, "UserHandler")
}func CreateProduct(c echo.Context) error {return c.String(http.StatusOK, "CreateProduct")
}
func FindProduct(c echo.Context) error {return c.String(http.StatusOK, "FindProduct")
}
func UpdateProduct(c echo.Context) error {return c.String(http.StatusOK, "UpdateProduct")
}
func DeleteProduct(c echo.Context) error {return c.String(http.StatusOK, "DeleteProduct")
}// 静态 > 参数 > 匹配路由
func main() {e := echo.New()e.GET("/", HelloFunc)r := e.Group("/api")r.GET("/user", UserHandler)//r.GET("/score", ScoreHandler)r.POST("/user", CreateProduct)r.DELETE("/user", DeleteProduct)r.PUT("/user", UpdateProduct)e.Logger.Fatal(e.Start(":1325"))e.GET("/product/1/price/*", func(c echo.Context) error {return c.String(http.StatusOK, "Product 1 price all")})e.GET("/product/:id", func(c echo.Context) error {return c.String(http.StatusOK, "Product "+c.Param("id"))})e.GET("/product/new", func(c echo.Context) error {return c.String(http.StatusOK, "Product new")})}

Part3 提取参数

在接收网页端的请求时,要对请求进行解析。如何解析是这个part的内容,表单发送过来的请求,REST请求,普通带问候的请求方式

package mainimport ("github.com/labstack/echo""net/http"
)func MyHandler(c echo.Context) error {p := new(Product)if err := c.Bind(p); err != nil {return c.String(http.StatusBadRequest, "bad request")}return c.JSON(http.StatusOK, p)
}func MyHandler2(c echo.Context) error {name := c.FormValue("name")return c.String(http.StatusOK, name)
}func MyHandler3(c echo.Context) error {name := c.QueryParam("name")return c.String(http.StatusOK, name)
}func MyHandler4(c echo.Context) error {name := c.Param("name")return c.String(http.StatusOK, name)
}type Product struct {Name  string `json:"name" form:"name" query:"name"`Price int    `json:"price" form:"price" query:"price"`
}func main() {e := echo.New()e.GET("/products", MyHandler)//在postman 中formdata进行请求e.GET("/products2", MyHandler2)//与products类似e.GET("/products3", MyHandler3)e.GET("/products4/:name", MyHandler4)e.Logger.Fatal(e.Start(":1328"))
}

Part4 解析json与xml

本part对json传输进行了详细的demo样例,json较为常用。


import ("encoding/json""github.com/labstack/echo""net/http"
)type Product struct {Name  string `json:"name" form:"name" query:"name"`Price int    `json:"price" form:"price" query:"price"`
}func main() {e := echo.New()e.GET("/", func(c echo.Context) error {return c.String(http.StatusOK, "Hello, World!")})e.GET("/html", func(c echo.Context) error {return c.HTML(http.StatusOK, "<h1>Hello, World!</h1>")})e.GET("/json", func(c echo.Context) error {p := &Product{Name:  "football",Price: 1000,}return c.JSON(http.StatusOK, p)})e.GET("/prettyjson", func(c echo.Context) error {p := &Product{Name:  "soccer",Price: 1000,}return c.JSONPretty(http.StatusOK, p, "  ")})e.GET("/streamjson", func(c echo.Context) error {p := &Product{Name:  "soccer",Price: 134,}c.Response().Header().Set("Content-Type", echo.MIMEApplicationXMLCharsetUTF8)c.Response().WriteHeader(http.StatusOK)return json.NewEncoder(c.Response()).Encode(p)})e.GET("/jsonblob", func(c echo.Context) error {p := &Product{Name:  "volley",Price: 120,}data, _ := json.Marshal(p)return c.JSONPBlob(http.StatusOK, "", data)})e.GET("/xml", func(c echo.Context) error {p := &Product{Name:  "basketball",Price: 120,}return c.XML(http.StatusOK, p)})e.GET("/png", func(c echo.Context) error {//return c.File("./public/left.png")return c.File("./public/test.html")})e.GET("blub", func(c echo.Context) error {data := []byte(`0306703,0035866,NO_ACTION,06/19/2006`)return c.Blob(http.StatusOK, "text/csv", data)})e.GET("null", func(c echo.Context) error {return c.NoContent(http.StatusOK)})e.Logger.Fatal(e.Start(":1330"))
}

Part5 json传输

package mainimport ("encoding/json""github.com/labstack/echo""net/http"
)type Product struct {Name  string `json:"name" form:"name" query:"name"`Price int    `json:"price" form:"price" query:"price"`
}func main() {e := echo.New()e.GET("/", func(c echo.Context) error {return c.String(http.StatusOK, "Hello, World!")})e.GET("/html", func(c echo.Context) error {return c.HTML(http.StatusOK, "<h1>Hello, World!</h1>")})e.GET("/json", func(c echo.Context) error {p := &Product{Name:  "football",Price: 1000,}return c.JSON(http.StatusOK, p)})e.GET("/prettyjson", func(c echo.Context) error {p := &Product{Name:  "soccer",Price: 1000,}return c.JSONPretty(http.StatusOK, p, "  ")})e.GET("/streamjson", func(c echo.Context) error {p := &Product{Name:  "soccer",Price: 134,}c.Response().Header().Set("Content-Type", echo.MIMEApplicationXMLCharsetUTF8)c.Response().WriteHeader(http.StatusOK)return json.NewEncoder(c.Response()).Encode(p)})e.GET("/jsonblob", func(c echo.Context) error {p := &Product{Name:  "volley",Price: 120,}data, _ := json.Marshal(p)return c.JSONPBlob(http.StatusOK, "", data)})e.GET("/xml", func(c echo.Context) error {p := &Product{Name:  "basketball",Price: 120,}return c.XML(http.StatusOK, p)})e.GET("/png", func(c echo.Context) error {//return c.File("./public/left.png")return c.File("./public/test.html")})e.GET("blub", func(c echo.Context) error {data := []byte(`0306703,0035866,NO_ACTION,06/19/2006`)return c.Blob(http.StatusOK, "text/csv", data)})e.GET("null", func(c echo.Context) error {return c.NoContent(http.StatusOK)})e.Logger.Fatal(e.Start(":1330"))
}

Part6 模版渲染


import ("github.com/labstack/echo""net/http"
)func main() {e := echo.New()e.GET("/", func(c echo.Context) error {return c.String(http.StatusOK, "Hello, World!")})e.GET("/index", func(c echo.Context) error {return c.File("assets/index.html")})e.Static("/static", "assets")e.Logger.Fatal(e.Start(":9090"))
}

Part7 模版参数传递


import ("github.com/labstack/echo""html/template""io""net/http"
)type Template struct {templates *template.Template
}func (t *Template) Render(w io.Writer,name string, data interface{}, c echo.Context) error {return t.templates.ExecuteTemplate(w, name, data)
}
func main() {e := echo.New()t := &Template{templates: template.Must(template.ParseGlob("public/view/*.html")),}e.Renderer = te.GET("/", func(c echo.Context) error {return c.Render(http.StatusOK, "index", "Hello, World!")})e.GET("/hello", func(c echo.Context) error {return c.Render(http.StatusOK, "hello", "World")})e.Logger.Fatal(e.Start(":1325"))
}

Part8 Cookie与Session


import ("fmt""github.com/gorilla/sessions""github.com/labstack/echo""github.com/labstack/echo-contrib/session""github.com/labstack/echo/v4""net/http""time"
)func WriteCookie(c echo.Context) error {cookie := new(http.Cookie)cookie.Name = "userName"cookie.Value = "cookieValue"cookie.Expires = time.Now().Add(time.Hour * 2)c.SetCookie(cookie)return c.String(http.StatusOK, "write a cookie")
}func ReadCookie(c echo.Context) error {cookie, err := c.Cookie("userName")if err != nil {return err}fmt.Println(cookie.Name)fmt.Println(cookie.Value)return c.String(http.StatusOK, "read cookie")
}func ReadAllCookie(c echo.Context) error {for _, cookie := range c.Cookies() {fmt.Println(cookie.Name)fmt.Println(cookie.Value)}return c.String(http.StatusOK, "read all cookie")
}func SessionHandler(c echo.Context) error {sess, _ := session.Get("session", c)sess.Options = &sessions.Options{Path:     "/",MaxAge:   86400 * 7,HttpOnly: true,}sess.Values["foo"] = "bar"sess.Save(c.Request(), c.Response())return c.String(http.StatusOK, "session handler")
}
func main() {e := echo.New()e.GET("/", func(c echo.Context) error {return c.String(http.StatusOK, "<h1>Hello, World</h1>")})e.GET("/writeCookie", WriteCookie)e.GET("/readCookie", ReadCookie)e.GET("/readAllCookie", ReadAllCookie)store := sessions.NewCookieStore([]byte("secret"))// 使用会话中间件e.Use(session.Middleware(store))//e.Use(session.Middleware(sessions.NewCookieStore([]byte("secret"))))e.GET("/session", SessionHandler)e.Logger.Fatal(e.Start(":1325"))
}

Part9 JWT

import ("github.com/dgrijalva/jwt-go""github.com/labstack/echo""github.com/labstack/echo/middleware""net/http""strconv""time"
)type User struct {Username string `json:"username"`Password string `json:"password"`
}const jwtSecret = "secret"type JwtCustomClaims struct {Name string `json:"name"`ID   int    `json:"id"`jwt.StandardClaims
}func Login(c echo.Context) error {u := new(User)if err := c.Bind(u); err != nil {return c.JSON(http.StatusOK, echo.Map{"errcode": 401,"errmsg":  "request error",})}if "pass" == u.Password && u.Username == "name" {claims := &JwtCustomClaims{Name: u.Username,ID:   12,StandardClaims: jwt.StandardClaims{ExpiresAt: time.Now().Add(time.Hour * 24).Unix()},}token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)t, err := token.SignedString([]byte(jwtSecret))if err != nil {return err}return c.JSON(http.StatusOK, echo.Map{"token":   t,"errcode": 200,"errmsg":  "success",})} else {return c.JSON(http.StatusOK, echo.Map{"errcode": -1,"errmsg":  "failed",})}
}
func main() {e := echo.New()e.GET("/", func(c echo.Context) error {return c.String(http.StatusOK, "<h1>Hello, World</h1>")})e.POST("/login", Login)r := e.Group("/api")r.Use(middleware.JWTWithConfig(middleware.JWTConfig{Claims:     &JwtCustomClaims{},SigningKey: []byte(jwtSecret),}))r.Use(func(next echo.HandlerFunc) echo.HandlerFunc {return func(c echo.Context) error {user := c.Get("user").(*jwt.Token)claims := user.Claims.(*JwtCustomClaims)c.Set("name", claims.Name)c.Set("uid", claims.ID)return next(c)}})r.GET("/getInfo", func(c echo.Context) error {name := c.Get("name").(string)id := c.Get("id").(int)return c.String(http.StatusOK, "name:"+name+"id:"+strconv.Itoa(id))})e.Logger.Fatal(e.Start(":1323"))
}

Part9 日志


import ("github.com/labstack/echo""github.com/labstack/echo/middleware""github.com/labstack/gommon/log""net/http"
)func main() {e := echo.New()e.Use(middleware.Logger())e.GET("/", func(c echo.Context) error {e.Logger.Debugf("这是格式化输出%s")e.Logger.Debugj(log.JSON{"aaa": "cccc"})e.Logger.Debug("aaaa")return c.String(http.StatusOK, "<h1>Hello, World</h1>")})e.Logger.SetLevel(log.INFO)e.GET("/info", func(c echo.Context) error {e.Logger.Infof("这是格式化输出%s")e.Logger.Infoj(log.JSON{"aaa": "cccc"})e.Logger.Info("aaaa")return c.String(http.StatusOK, "INFO PAGE!")})e.Logger.Fatal(e.Start(":1323"))}

Part10 文件上传与下载


import ("github.com/labstack/echo""io""net/http""os"
)func upload(c echo.Context) error {file, err := c.FormFile("filename")if err != nil {return err}src, err := file.Open()if err != nil {return err}defer src.Close()dst, err := os.Create("upload/" + file.Filename)if err != nil {return err}defer dst.Close()if _, err = io.Copy(dst, src); err != nil {return err}return c.String(http.StatusOK, "upload success")
}
func multiUpload(c echo.Context) error {form, err := c.MultipartForm()if err != nil {return err}files := form.File["files"]for _, file := range files {src, err := file.Open()if err != nil {return err}defer src.Close()dst, err := os.Create("upload/" + file.Filename)if err != nil {return err}defer dst.Close()if _, err = io.Copy(dst, src); err != nil {return err}}return c.String(http.StatusOK, "upload success")}
func main() {e := echo.New()e.GET("/", func(c echo.Context) error {return c.Attachment("attachment.txt", "attachment.txt")})e.GET("/index", func(c echo.Context) error {return c.File("./multiUpload.html")})e.POST("/upload", upload)e.POST("/multiUpload", multiUpload)e.Logger.Fatal(e.Start(":1335"))
}

Part 11 Websocket通信

package mainimport ("fmt""github.com/gorilla/websocket""github.com/labstack/echo""github.com/labstack/echo/middleware"
)var upgrader = websocket.Upgrader{}func hello(c echo.Context) error {ws, err := upgrader.Upgrade(c.Response(), c.Request(), nil)if err != nil {return err}defer ws.Close()for {err := ws.WriteMessage(websocket.TextMessage, []byte("hello world"))if err != nil {c.Logger().Error(err)}_, msg, err := ws.ReadMessage()if err != nil {c.Logger().Error(err)}fmt.Printf("%s\n", msg)}
}
func main() {e := echo.New()e.Use(middleware.Logger())e.Use(middleware.Recover())e.Static("/", "./public")e.GET("/", func(c echo.Context) error {return c.File("./public/webtest.html")})e.GET("/ws", hello)e.Logger.Fatal(e.Start(":1330"))
}

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

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

相关文章

mqtt详细介绍及集成到springboot

mqtt详细介绍及集成到springboot 1.mqtt发布/订阅消息参数详细介绍2. mqtt客户端连接参数介绍3. docker-compose搭建mqtt服务端4. springboot集成mqtt实现发布订阅5. 测试注意事项 1.mqtt发布/订阅消息参数详细介绍 1.1. qosQoS0 &#xff0c;Sender 发送的一条消息&#xff0…

基于springboot的租房网站系统

作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 项目包含&#xff1a; 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…

自动化办公|xlwings简介

xlwings 是一个开源的 Python 库&#xff0c;旨在实现 Python 与 Microsoft Excel 的无缝集成。它允许用户使用 Python 脚本自动化 Excel 操作&#xff0c;读取和写入数据&#xff0c;执行宏&#xff0c;甚至调用 VBA 脚本。这使得数据分析、报告生成和其他与 Excel 相关的任务…

概率函数,累计分布函数

四. 累计分布函数 1. 累计分布函数&#xff08;CDF, Cumulative Distribution Function&#xff09; 累计分布函数是用来描述随机变量取值小于或等于某个给定值的概率。它适用于离散型和连续型随机变量&#xff0c;并且能够通过概率质量函数&#xff08;PMF&#xff09;或概率…

Flutter项目适配鸿蒙

Flutter项目适配鸿蒙 前言Flutter项目适配鸿蒙新工程直接支持ohos构建新项目编译运行 适配已有的Flutter项目 前言 目前市面上使用Flutter技术站的app不在少数&#xff0c;对于Flutter的项目&#xff0c;可能更多的是想直接兼容Harmonyos&#xff0c;而不是直接在重新开发一个…

链家房价数据爬虫和机器学习数据可视化预测

完整源码项目包获取→点击文章末尾名片&#xff01;

【20250113】基于肌肉形变测量的连续步态相位估计算法,可自适应步行速度和地形坡度...

【基本信息】 论文标题&#xff1a;Continuous Gait Phase Estimation by Muscle Deformations with Speed and Ramp Adaptability 发表期刊&#xff1a;IEEE Sensors Journal 发表时间&#xff1a;2024年5月30日 【访问链接】 论文链接&#xff1a;https://ieeexplore.ieee.or…

【全套】基于分类算法的学业警示预测信息管理系统

【全套】基于分类算法的学业警示预测信息管理系统 【摘 要】 随着网络技术的发展基于分类算法的学业警示预测信息管理系统是一种新的管理方式&#xff0c;同时也是现代学业预测信息管理的基础&#xff0c;利用互联网的时代与实际情况相结合来改变过去传统的学业预测信息管理中…

小程序组件 —— 31 事件系统 - 事件绑定和事件对象

小程序中绑定事件和网页开发中绑定事件几乎一致&#xff0c;只不过在小程序不能通过 on 的方式绑定事件&#xff0c;也没有 click 等事件&#xff0c;小程序中绑定事件使用 bind 方法&#xff0c;click 事件也需要使用 tap 事件来进行代替&#xff0c;绑定事件的方式有两种&…

邮箱发送验证码(nodemailer)

邮箱发送验证码 打开SMTP 服务使用 Node.js 邮件发送模块&#xff08;nodemailer&#xff09;封装验证码组件 开发中经常会遇到需要验证码&#xff0c;不过手机验证码需要money&#xff0c;不到必要就不必花费&#xff0c;所以可以使用邮箱发送验证码 打开SMTP 服务 根据自己想…

AV1视频编解码简介、码流结构(OBU)

我的音视频/流媒体开源项目(github) 目录 一、AV1编码技术 二、AV1码流结构(OBU) 三、IVF文件格式 四、ffmpeg支持AV1 五、关于常见格式对AV1的封装 一、AV1编码技术 AV1是由开放媒体联盟(AOM&#xff0c;Alliance for Open Media)在2018年发布的&#xff0c;AV1的前身…

Sentaurus TCAD学习笔记:transform指令

目录 一、transform指令简介二、transform指令的实现1.cut指令2.flip指令3.rotate指令4.stretch指令5.translate指令6.reflect指令 三、transform指令示例 一、transform指令简介 在Sentaurus中&#xff0c;如果需要对器件进行翻转、平移等操作&#xff0c;可以通过transform指…

kafka消费堆积问题探索

背景 我们的商城项目用PHP写的&#xff0c;原本写日志方案用的是PHP的方案&#xff0c;但是&#xff0c;这个方案导致资源消耗一直降不下来&#xff0c;使用了20个CPU。后面考虑使用通过kafka的方案写日志&#xff0c;商城中把产生的日志丢到kafka中&#xff0c;在以go写的项目…

【opencv】第7章 图像变换

7.1 基 于OpenCV 的 边 缘 检 测 本节中&#xff0c;我们将一起学习OpenCV 中边缘检测的各种算子和滤波器——Canny 算子、Sobel 算 子 、Laplacian 算子以及Scharr 滤波器。 7.1.1 边缘检测的一般步骤 在具体介绍之前&#xff0c;先来一起看看边缘检测的一般步骤。 1.【第…

[Qt]常用控件介绍-多元素控件-QListWidget、QTableWidget、QQTreeWidget

目录 1.多元素控件介绍 2.ListWidget控件 属性 核心方法 核心信号 细节 Demo&#xff1a;编辑日程 3.TableWidget控件 核心方法 QTableWidgetItem核心信号 QTableWidgetItem核心方法 细节 Demo&#xff1a;编辑学生信息 4.TreeWidget控件 核心方法 核心信号…

[Linux]从零开始的STM32MP157交叉编译环境配置

一、前言 最近该忙的事情也是都忙完了&#xff0c;也是可以开始好好的学习一下Linux了。之前九月份的时候就想入手一块Linux的开发板用来学习Linux底层开发。之前在NXP和STM32MP系列之间犹豫&#xff0c;思来想去还是入手了一块STM32MP157。当然不是单纯因为MP157的性能在NXP之…

小程序如何引入腾讯位置服务

小程序如何引入腾讯位置服务 1.添加服务 登录 微信公众平台 注意&#xff1a;小程序要企业版的 第三方服务 -> 服务 -> 开发者资源 -> 开通腾讯位置服务 在设置 -> 第三方设置 中可以看到开通的服务&#xff0c;如果没有就在插件管理中添加插件 2.腾讯位置服务…

添加计算机到AD域中

添加计算机到AD域中 一、确定计算机的DNS指向域中的DNS二、打开系统设置三、加域成功后 一、确定计算机的DNS指向域中的DNS 二、打开系统设置 输入域管理员的账密 三、加域成功后 这里有显示&#xff0c;就成功了。

从epoll事件的视角探讨TCP:三次握手、四次挥手、应用层与传输层之间的联系

目录 一、应用层与TCP之间的联系 二、 当通信双方中的一方如客户端主动断开连接时&#xff0c;仅是在客户端的视角下连接已经断开&#xff0c;在服务端的眼中&#xff0c;连接依然存在&#xff0c;为什么&#xff1f;——触发EPOLLRDHUP事件&#xff1a;对端关闭连接或停止写…

使用RSyslog将Nginx Access Log写入Kafka

个人博客地址&#xff1a;使用RSyslog将Nginx Access Log写入Kafka | 一张假钞的真实世界 环境说明 CentOS Linux release 7.3.1611kafka_2.12-0.10.2.2nginx/1.12.2rsyslog-8.24.0-34.el7.x86_64.rpm 创建测试Topic $ ./kafka-topics.sh --zookeeper 192.168.72.25:2181/k…