1.go web之gin框架

Gin框架

一、准备

1.下载依赖

 go get -u github.com/gin-gonic/gin

2.引入依赖

import "github.com/gin-gonic/gin"

3. (可选)如果使用诸如 http.StatusOK 之类的常量,则需要引入 net/http 包

import "net/http"

二、基本使用

1. 配置路由

package mainimport "github.com/gin-gonic/gin"func main() {// 创建一个默认的路由引擎r := gin.Default()// 配置路由r.GET("/getInfo", func(c *gin.Context) {c.JSON(200, gin.H{"msg": "成功",})})//启动 HTTP 服务,在8088端口监听r.Run(":8088")
}

在这里插入图片描述

三、Gin中的路由

1.路由概述

在 RESTful 架构中,每个网址代表一种资源,不同的请求方式表示执行不同的操作:

请求方式一般对应操作
GET(SELECT)从服务器取出资源(一项或多项)
POST(CREATE))在服务器新建一个资源
PUT(UPDATE)在服务器更新资源(客户端提供改变后的完整资源)
DELETE(DELETE))从服务器删除资源

2.简单路由

GET请求
r.GET("网址", func(c *gin.Context) {
c.String(200, "Get")
})
POST请求
r.POST("网址", func(c *gin.Context) {
c.String(200, "POST")
})
PUT请求
r.PUT("网址", func(c *gin.Context) {
c.String(200, "PUT")
})
DELETE请求
r.DELETE("网址", func(c *gin.Context) {
c.String(200, "DELETE")
})
动态路由
	r.GET("/getUser/:id", func(c *gin.Context) {id := c.Param("id")c.JSON(200, gin.H{"id":  id,"msg": "成功",})})

在这里插入图片描述

四、 响应格式

这里主要介绍使用比较多的字符串格式和json格式

c.String()

	r.GET("/getStr", func(c *gin.Context) {c.String(200, "成功")})

响应结果为字符串
在这里插入图片描述

c.JSON()

	r.GET("/getInfo", func(c *gin.Context) {c.JSON(200, gin.H{"msg": "成功",})})

响应结果为json格式
在这里插入图片描述

五、路由传参

1.GET请求传值

请求路径: /user?uid=20&page=1

后端接收

router.GET("/user", func(c *gin.Context) {
//c.Query()接收请求GET请求路径参数
uid := c.Query("uid")
//c.DefaultQuery()接收请求GET请求路径参数,接收不到时,采用默认参数
page := c.DefaultQuery("page", "0")
c.String(200, "uid=%v page=%v", uid, page)
})

2.Post 请求传值(获取 form 表单)

请求路径:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="/doAddUser" method="post">
用户名:<input type="text" name="username" />
密码: <input type="password" name="password" />
<input type="submit" value="提交">
</form>
</body>
</html>

后端接收

router.POST("/doAddUser", func(c *gin.Context) {
//c.PostForm()接收form表单数据,key要与form表单name属性对应
username := c.PostForm("username")
password := c.PostForm("password")
//c.PostForm()接收form表单数据,接收不到采用默认值,key要与form表单name属性对应
age := c.DefaultPostForm("age", "20")
c.JSON(200, gin.H{ "usernmae": username, "password": password, "age": age, })
})

3.动态路由传值

请求路径:/user/20

后端接收

r.GET("/user/:uid", func(c *gin.Context) {
//c.Param()接收动态路由参数
uid := c.Param("uid")
c.String(200, "userID=%s", uid)
})

4.GET,POST 传递的结构体数据

Get 传值绑定到结构体

请求路径: /?username=zhangsan&password=123456

后端接收

//注意首字母大写
type Userinfo struct {
Username string `form:"username" json:"user"`
Password string `form:"password" json:"password"` }router.GET("/", func(c *gin.Context) {
var userinfo Userinfo
if err := c.ShouldBind(&userinfo); err == nil {
c.JSON(http.StatusOK, userinfo)
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
Post 传值绑定到结构体

请求路径:
在这里插入图片描述

后端接收

router.POST("/doLogin", func(c *gin.Context) {
var userinfo Userinfo
if err := c.ShouldBind(&userinfo); err == nil {
c.JSON(http.StatusOK, userinfo)
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})

.ShouldBind()能够基于请求自动提
取 JSON、form 表单和 QueryString 类型的数据,并把值绑定到指定的结构体对象

六、路由组

func main() {router := gin.Default()// 简单的路由组: v1v1 := router.Group("/v1"){v1.POST("/login", loginEndpoint)v1.POST("/submit", submitEndpoint)v1.POST("/read", readEndpoint)}// 简单的路由组: v2v2 := router.Group("/v2"){v2.POST("/login", loginEndpoint)v2.POST("/submit", submitEndpoint)v2.POST("/read", readEndpoint)}router.Run(":8080")
}

七、Gin路由文件分组

新建 routes 文件夹,routes 文件下面新建 adminRoutes.goapiRoutes.go、defaultRoutes.go

新建adminRoutes

package routesimport ("net/http""github.com/gin-gonic/gin"
)func AdminRoutesInit(router *gin.Engine) {adminRouter := router.Group("/admin"){adminRouter.GET("/user", func(c *gin.Context) {c.String(http.StatusOK, "用户")})adminRouter.GET("/news", func(c *gin.Context) {c.String(http.StatusOK, "news")})}
}

新建apiRoutes.go

package routesimport ("net/http""github.com/gin-gonic/gin"
)func ApiRoutesInit(router *gin.Engine) {apiRoute := router.Group("/api"){apiRoute.GET("/user", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"username": "张三","age": 20})})apiRoute.GET("/news", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"title": "这是新闻"})})}
}

新建defaultRoutes.go

package routesimport ("github.com/gin-gonic/gin"
)func DefaultRoutesInit(router *gin.Engine) {defaultRoute := router.Group("/"){defaultRoute.GET("/", func(c *gin.Context) {c.String(200, "首页")})}
}

配置main.go

package mainimport ("gin_demo/routes""github.com/gin-gonic/gin"//注意首字母大写
type Userinfo struct {Username string `form:"username" json:"user"`Password string `form:"password" json:"password"`
}func main() {r := gin.Default()routes.AdminRoutesInit(r)routes.ApiRoutesInit(r)routes.DefaultRoutesInit(r)r.Run(":8080")
}

八、Gin中自定义控制器

控制器分组

1.新建controller/admin/NewsController.go
package adminimport ("net/http""github.com/gin-gonic/gin"
)type NewsController struct {
}func (c NewsController) Index(ctx *gin.Context) {ctx.String(http.StatusOK, "新闻首页")
}
2.新建 controller/admin/UserController.go
package adminimport ("net/http""github.com/gin-gonic/gin"
)type UserController struct {
}func (c UserController) Index(ctx *gin.Context) {ctx.String(http.StatusOK, "这是用户首页")
}
func (c UserController) Add(ctx *gin.Context) {ctx.String(http.StatusOK, "增加用户")
}
3.在路由文件分组中配置控制器(将处理中间件改为控制器的方法)
package routesimport ("gin_demo/controller/admin""github.com/gin-gonic/gin"
)func AdminRoutesInit(router *gin.Engine) {adminRouter := router.Group("/admin"){adminRouter.GET("/user", admin.UserController{}.Index)adminRouter.GET("/user/add", admin.UserController{}.Add)adminRouter.GET("/news", admin.NewsController{}.Add)}
}

九、路由中间件

通俗的讲:中间件就是匹配路由前和匹配路由完成后执行的一系列操作

Gin 中的中间件必须是一个 gin.HandlerFunc 类型,配置路由的时候可以传递多个 func 回调函
数,最后一个 func 回调函数前面触发的方法都可以称为中间件。

1.路由中间件基本使用

package mainimport ("fmt""github.com/gin-gonic/gin"
)func initMiddleware(ctx *gin.Context) {fmt.Println("我是一个中间件")
}
func main() {r := gin.Default()r.GET("/", initMiddleware, func(ctx *gin.Context) {ctx.String(200, "首页--中间件演示")})r.GET("/news", initMiddleware, func(ctx *gin.Context) {ctx.String(200, "新闻页面--中间件演示")})r.Run(":8080")
}

2.ctx.Next()调用该请求的剩余处理程序

中间件里面加上 ctx.Next()可以让我们在路由匹配完成后执行一些操作
比如我们统计一个请求的执行时间。

package mainimport ("fmt""time""github.com/gin-gonic/gin"
)func initMiddleware(ctx *gin.Context) {fmt.Println("1-执行中中间件")start := time.Now().UnixNano()// 调用该请求的剩余处理程序ctx.Next()fmt.Println("3-程序执行完成 计算时间")// 计算耗时 Go 语言中的 Since()函数保留时间值,并用于评估与实际时间的差异end := time.Now().UnixNano()fmt.Println(end - start)
}
func main() {r := gin.Default()r.GET("/", initMiddleware, func(ctx *gin.Context) {fmt.Println("2-执行首页返回数据")ctx.String(200, "首页--中间件演示")})r.GET("/news", initMiddleware, func(ctx *gin.Context) {ctx.String(200, "新闻页面--中间件演示")})r.Run(":8080")
}

3.全局中间件

package mainimport ("fmt""github.com/gin-gonic/gin"
)func initMiddleware(ctx *gin.Context) {fmt.Println("全局中间件 通过 r.Use 配置")// 调用该请求的剩余处理程序ctx.Next()
}
func main() {r := gin.Default()//注册全局中间件r.Use(initMiddleware)r.GET("/", func(ctx *gin.Context) {ctx.String(200, "首页--中间件演示")})r.GET("/news", func(ctx *gin.Context) {ctx.String(200, "新闻页面--中间件演示")})r.Run(":8080")
}

4.在路由分组中配置中间件

写法一:

shopGroup := r.Group("/shop", StatCost())
{
shopGroup.GET("/index", func(c *gin.Context) {...})
... }

写法二:

shopGroup := r.Group("/shop")
shopGroup.Use(StatCost())
{
shopGroup.GET("/index", func(c *gin.Context) {...})
... }

十、中间件和对应控制器之间共享数据

1.设置值

func InitAdminMiddleware(ctx *gin.Context) {// 可以通过 ctx.Set 在请求上下文中设置值,后续的处理函数能够取到该值ctx.Set("username", "张三")
}

2.获取值

func (c UserController) Index(ctx *gin.Context) {username, _ := ctx.Get("username")
}

十一、中间件注意事项

gin 默认中间件
gin.Default()默认使用了 Logger 和 Recovery 中间件,其中:
• Logger 中间件将日志写入 gin.DefaultWriter,即使配置了 GIN_MODE=release。
• Recovery 中间件会 recover 任何 panic。如果有 panic 的话,会写入 500 响应码。
如果不想使用上面两个默认的中间件,可以使用 **gin.New()**新建一个没有任何默认中间件的路由

gin 中间件中使用 goroutine
当在中间件或 handler 中启动新的 goroutine 时,不能使用原始的上下文(c *gin.Context),
必须使用其只读副本(c.Copy())

r.GET("/", func(c *gin.Context) {//拷贝副本cCp := c.Copy()go func() {// simulate a long task with time.Sleep(). 5 secondstime.Sleep(5 * time.Second)// 这里使用你创建的副本fmt.Println("Done! in path " + cCp.Request.URL.Path)}()c.String(200, "首页")
})

十二、Gin中的Cookie

设置cookie

c.SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)

获取cookie

cookie, err := c.Cookie("name")

完整demo

package mainimport ("gin_demo/models""github.com/gin-gonic/gin""html/template"
)func main() {r := gin.Default()r.SetFuncMap(template.FuncMap{"unixToDate": models.UnixToDate})r.GET("/", func(c *gin.Context) {//设置cookiec.SetCookie("usrename", "张三", 3600, "/", "localhost", false, true)c.String(200, "首页")})r.GET("/user", func(c *gin.Context) {//获取cookieusername, _ := c.Cookie("usrename")c.String(200, "用户-"+username)})r.Run(":8080")
}

十三、Gin中的Session

Gin 官方没有给我们提供 Session 相关的文档,这个时候我们可以使用第三方的 Session 中间件来实现
session

gin-contrib/sessions 中间件支持的存储引擎:
• cookie
• memstore
• redis
• memcached
• mongodb

1.安装session包

go get github.com/gin-contrib/sessions

2.基本session用法

package mainimport ("github.com/gin-contrib/sessions""github.com/gin-contrib/sessions/cookie""github.com/gin-gonic/gin"
)func main() {r := gin.Default()// 1.创建基于 cookie 的存储引擎,secret11111 参数是用于加密的秘钥store := cookie.NewStore([]byte("secret11111"))// 设置 session 中间件,参数 mysession,指的是 session 的名字,也是 cookie 的名字// 2.store 是前面创建的存储引擎,我们可以替换成其他存储引擎r.Use(sessions.Sessions("mysession", store))r.GET("/", func(c *gin.Context) {//初始化 session 对象session := sessions.Default(c)//设置过期时间session.Options(sessions.Options{MaxAge: 3600 * 6, // 6hrs})//设置 Sessionsession.Set("username", "张三")session.Save()c.JSON(200, gin.H{"msg": session.Get("username")})})r.GET("/user", func(c *gin.Context) {// 初始化 session 对象session := sessions.Default(c)// 通过 session.Get 读取 session 值username := session.Get("username")c.JSON(200, gin.H{"username": username})})r.Run(":8000")
}

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

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

相关文章

python之K线模式识别

1、晨星 晨星也称作早晨之星&#xff0c;它是一种三日形态的K线组合&#xff0c;第一日是阴线&#xff0c;第二日价格振幅较小&#xff0c;第三日出现阳线&#xff0c;它的一般形态如下图所示。晨星的K线组合形态一般出现在下跌的趋势之后&#xff0c;预示着价格的上升回调。其…

Java架构师缓存架构设计

目录 1 导学2 高性能概述2.1 高性能的定义和衡量指标2.2 如何实现高性能的计算机系统或软件程序2.3 木桶理论2.4 如何实现计算机系统或软件程序的高性能3 多级缓存设计3.1 浏览器缓存3.2 CDN缓存3.3 负载均衡的缓存3.4 进程内缓存3.5 分布式缓存4 缓存技术方案5 如何进行缓存拆…

C++学习day5

目录 作业&#xff1a; 1> 思维导图 2> 多继承代码实现沙发床 1>思维导图 2> 多继承代码实现沙发床 #include <iostream>using namespace std; //创建沙发类 class sofa { private:string sitting; public:sofa(){cout << "sofa的无参构造函数…

Docker系列--网络的配置

原文网址&#xff1a;Docker系列--网络的配置_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Docker的网络的配置。 官网网址 https://docs.docker.com/engine/reference/commandline/network/ 网络的默认设置 Docker启动之后&#xff0c;系统中会产生一个名为docker0的…

如何调整 Kubernetes StatefulSet 卷的大小

Kubernetes StatefulSet用于在集群内部署有状态应用程序。StatefulSet 中的每个 Pod 都可以访问即使在重新调度后仍坚持使用的本地持久卷。这使得 Pod 能够维护与其集合中的邻居不同的单独状态。 不幸的是,这些卷有一个很大的限制:Kubernetes 没有提供从 StatefulSet 对象调整…

【AI】Interesting Applications

文章目录 【盘古】【嗜睡检测】【3D AI 生成】多模态——指哪打哪【AlphaDev&#xff1a;汇编版 AlphaZero】【ChatExcel】 【盘古】 2023年7月&#xff0c;华为正式发布盘古大模型3.0&#xff0c;并提出3层模型架构。 L0&#xff1a;基础大模型&#xff0c;包括自然语言、视觉…

塑胶材料检测对激光焊机的作用

塑胶材料的激光焊接已经普遍用于各种零配件&#xff0c;而塑料的透光率是焊接工艺质量的一个重要指标。针对这类塑胶材料推出这款专门检测塑胶材料近红外透光率特性的透光率检测仪&#xff0c;对注塑件的透光率进行全画面扫描。 全球工业致力于贯彻绿色环保、节能减排发展理念&…

Selenium+Pytest自动化测试框架

前言 selenium自动化 pytest测试框架 本章你需要 一定的python基础——至少明白类与对象&#xff0c;封装继承 一定的selenium基础——本篇不讲selenium&#xff0c;不会的可以自己去看selenium中文翻译网 测试框架简介 测试框架有什么优点呢&#xff1a; 代码复用率高&…

16+sci,多重免疫组织化学+CIBERSORTx 鉴定成纤维细胞亚群。

今天给同学们分享一篇单细胞多重免疫组织化学数字细胞学&#xff08;CIBERSORTx&#xff09;的生信文章“Single-cell analysis reveals prognostic fibroblast subpopulations linked to molecular and immunological subtypes of lung cancer”&#xff0c;这篇文章于2023年1…

springboot就业信息管理系统springboot32

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

nodejs+vue宠物店管理系统

例如&#xff1a;如何在工作琐碎,记录繁多的情况下将宠物店管理的当前情况反应给管理员决策,等等。在此情况下开发一款宠物店管理系统小程序&#xff0c; 困扰管理层的许多问题当中,宠物店管理也是不敢忽视的一块。但是管理好宠物店又面临很多麻烦需要解决,于是乎变得非常合乎时…

conda: error: argument COMMAND: invalid choice: ‘activate‘

参考:https://github.com/conda/conda/issues/13022 输入后重启terminal即可

根据客户端设备更改 SAP GUI 布局

了解如何根据所使用的设备在客户端系统上显示图像。在这里&#xff0c;我们使用 _clientedition 系统变量来获取有关客户端系统的设备类型、平台类型和许可证类型的信息。我们将引导您完成以下步骤。 1.删除映像容器。 //删除屏幕上的图像容器 del("X[IMAGE_CONTAINER]&…

【设计模式】使用建造者模式组装对象并加入自定义校验

文章目录 1.前言1.1.创建对象时的痛点 2.建造者模式2.1 被建造类准备2.2.建造者类实现2.3.构建对象测试2.4.使用lombok简化建造者2.5.lombok简化建造者的缺陷 3.总结 1.前言 在我刚入行不久的时候就听说过建造者模式这种设计模式&#xff0c;当时只知道是用来组装对象&#xf…

Vuex存值取值与异步请求处理

目录 前言 一、Vuex简介 1.Vuex是什么 2.Vuex的核心概念 3.使用Vuex的好处 4.Vuex执行流程 二、Vuex的使用步骤 1.安装Vuex 2.创建store模块&#xff0c;分别维护state/actions/mutations/getters 3.使用Vuex存储值&#xff0c;获取值和改变值 1.state.js---存值 2.…

关于Vuex的基础使用存值及异步

目录 一.概述 二.取值 2.1.安装 2.2.菜单栏 2.3.模块 2.4.引用 三.改值 四.异步&后台请求 好啦今天就到这里了希望能帮到你哦&#xff01;&#xff01;&#xff01; 一.概述 Vuex 是一个用于 Vue.js 应用程序的状态管理库。它主要用于集中管理应用程序中的共享状态&a…

idea中maven plugin提示not found

在终端中输入&#xff1a; mvn dependency:resolve 然后 解决了部分问题 Plugin org.apache.maven.plugins:maven-jar-plugin:3.1.0 not found 改为3.3.0了 Plugin maven-source-plugin:3.3.0 not found 改为 2.4 了 版本下降了 感觉后继有坑 待观察

Linux网络和系统管理

网络管理命令 1、ifconfig 命令 作用 ifconfig 命令用于显示或设置网络设备的信息。格式 ifconfig [网卡名字] [参数]可选项 网卡名字:指定要操作的网络设备。参数: up:启动指定网卡。down:关闭指定网卡。-a:显示所有网卡接口的信息,包括未激活的网卡接口。使用示例 1…

时代风口中的Web3.0基建平台,重新定义Web3.0!

近年来&#xff0c;Web3.0概念的广泛兴起&#xff0c;给加密行业带来了崭新的叙事方式&#xff0c;同时也为加密行业提供了更加具有想象力的应用场景与商业空间&#xff0c;并让越来越多的行业从业者们意识到只有更大众化的市场共性需求才能推动加密市场的持续繁荣。当前围绕这…

IDEA设置自动导入包

IDEA设置自动导入包 首先进入设置选项 之后勾选以下两项&#xff1a; 第一项&#xff1a;IntelliJ IDEA 将在我们书写代码的时候自动帮我们优化导入的包&#xff0c;比如自动去掉一些没有用到的包。 第二项&#xff1a; IntelliJ IDEA 将在我们书写代码的时候自动帮我们导入…