goweb开发实战笔记(一)

article/2025/11/5 18:17:13

目录

🧡Gin简介

🧡Gin特性

🧡Gin环境搭建

🧡HTTP请求和参数解析

创建Engine

Handle方法处理

Engine分类处理

表单实体绑定

ShouldBindQuery

ShouldBind

JSON

多数据格式返回请求结果

[]byte切片

string

JSON

HTML

路由分组

🧡中间件的使用


💟这里是CS大白话专场,让枯燥的学习变得有趣!

💟没有对象不要怕,我们new一个出来,每天对ta说不尽情话!

💟好记性不如烂键盘,自己总结不如收藏别人!

🧡Gin简介

💌Gin 是一个 golang 的微框架,封装比较优雅,API 友好,源码注释比较明确,已经发布了1.0版本。具有快速灵活,容错方便等特点。其实对于 golang 而言,web 框架的依赖要远比 Python,Java 之类的要小。自身的 net/http 足够简单,性能也非常不错。框架更像是一些常用函数或者工具的集合。借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。

🍠Gin 框架是开源的,可以在 github 上下载其源码库,查看相应的说明:Gin源码库地址

🍠Gin 框架有一个官方网站,有对 Gin 相关的介绍和学习资料:Gin官网

🧡Gin特性

🍠速度:Gin 之所以被很多企业和团队所采用,第一个原因是因为其速度快,性能表现出众。

🍠中间件:和 iris 类似,gin 在处理请求时,支持中间件操作,方便编码处理。

🍠路由:在 gin 中可以非常简单地实现路由,路由组解析功能。

🍠内置渲染:Gin 支持 JSON、XML 和 HTML 等多种数据格式的渲染,并提供方便的操作 API。

🧡Gin环境搭建

💌gin 框架需要 go 语言版本在1.6及以上。可以通过 go version 查看 go 语言版本是否符合要求。

 

通过go get命令安装gin框架:

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

💌安装完毕后,可以在当前系统的 $GOPATH 目录下的 src/github.com 目录中找到 gin-gonic 目录,该目录下存放的就是 gin 框架的源码。

🧡HTTP请求和参数解析

创建Engine

💌在 gin 框架中,Engine 被定义成为一个结构体,其中包含了路由组、中间件、页面渲染接口、框架配置设置等相关内容。两种创建方式如下所示:

engine1 = gin.Default()
engine2 = gin.New()

💌gin.Default() 内也调用 gin.New() 创建Engine实例,但会默认使用Logger和Recovery中间件。

🍠Logger 是负责进行打印并输出日志的中间件,方便开发者进行程序调试。

🍠Recovery 中间件的作用是如果程序执行过程中遇到 panic 中断了服务,Recovery 会恢复程序执行,并返回服务器500内部错误。

💌通常情况下,使用默认的 gin.Default() 创建 Engine 实例

Handle方法处理

💌在 Engine 中可以使用 Handle 方法处理 HTTP 请求。Handle 方法包含三个参数,具体如下:

func (group *RouterGroup) Handle(httpMethod, relativePath string, handlers ...HandlerFunc)

🍠httpMethod:表示要处理的 HTTP 的请求类型,是 GET、POST、DELETE、OPTIONS、HEAD、PUT、TRACE、CONNECT 请求类型中的一种。

🍠relativePath:表示要解析的接口,由开发者进行定义。

🍠handlers:是处理对应的请求的代码的定义。

package mainimport ("fmt""github.com/gin-gonic/gin"
)func main() {engine := gin.Default()//GET//http://localhost:8080/hello?name=Jodieengine.Handle("GET", "/hello", func(context *gin.Context) {path := context.FullPath()fmt.Println(path)//获取name值,若没有则返回strangername := context.DefaultQuery("name", "stranger")fmt.Println(name)//页面显示内容context.Writer.Write([]byte("Hello, " + name))})//POST//http://localhost:8080/loginengine.Handle("POST", "/login", func(context *gin.Context) {fmt.Println(context.FullPath())username := context.PostForm("username")password := context.PostForm("password")fmt.Println(username)fmt.Println(password)context.Writer.Write([]byte("Hello, " + username))})engine.Run()
}

Engine分类处理

💌除了 Engine 中包含的通用的处理方法以外,Engine 还可以按类型直接解析。Engine 中包含有get方法、post方法、delet方法等与 HTTP 请求类型对应的方法。

package mainimport ("fmt""github.com/gin-gonic/gin"
)func main() {engine := gin.Default()//GETengine.GET("/hello", func(context *gin.Context) {path := context.FullPath()fmt.Println(path)name := context.Query("name")fmt.Println(name)context.Writer.Write([]byte("Hello, " + name))})//POSTengine.POST("/login", func(context *gin.Context) {fmt.Println(context.FullPath())username, existName := context.GetPostForm("username")if existName {fmt.Println(username)}password, existWord := context.GetPostForm("password")if existWord {fmt.Println(password)}context.Writer.Write([]byte("Hello, " + username))})//DELETEengine.DELETE("/user/:id", func(context *gin.Context) {userID := context.Param("id")fmt.Println(userID)context.Writer.Write([]byte("DELETE " + userID))})engine.Run()
}

表单实体绑定

💌使用 PostForm 这种单个获取属性和字段的方式,代码量较多,需要一个一个属性进行获取。而表单数据的提交,往往对应着完整的数据结构体定义,其中对应着表单的输入项。gin 框架提供了数据结构体和表单提交数据绑定的功能,提高表单数据获取的效率。如下所示:

以用户注册功能为例,假设用户注册提交表单数据包含三项:username、phone 和 password。 

type UserRegister struct {Username string `form:"username" binding:"required"`Phone    string `form:"phone"    binding:"required"`Password string `form:"password" binding:"required"`
}

创建了 UserRegister 结构体用于接收表单数据,通过 tag 标签的方式设置每个字段对应的 form 表单中的属性名,通过 binding 设置属性是否必须。

ShouldBindQuery

package mainimport ("fmt""github.com/gin-gonic/gin""log"
)func main() {engine := gin.Default()//GET//http://localhost:8080/hello?username=Jodie&password=1234engine.GET("/hello", func(context *gin.Context) {fmt.Println(context.FullPath())var user Usererr := context.ShouldBindQuery(&user)if err != nil {log.Fatal(err.Error())return}fmt.Println(user.Username)fmt.Println(user.Password)context.Writer.Write([]byte("Hello, " + user.Username))})engine.Run()
}type User struct {Username string `form:"username" binding:"required"`Password string `form:"password" binding:"required"`
}

ShouldBind

package mainimport ("fmt""github.com/gin-gonic/gin""log"
)func main() {engine := gin.Default()//POSTengine.POST("/regist", func(context *gin.Context) {fmt.Println(context.FullPath())var register UserRegistererr := context.ShouldBind(&register)if err != nil {log.Fatal(err.Error())return}fmt.Println(register.Username)fmt.Println(register.Phone)context.Writer.Write([]byte("Hello, " + register.Username))})engine.Run()
}type UserRegister struct {Username string `form:"username" binding:"required"`Phone    string `form:"phone"    binding:"required"`Password string `form:"password" binding:"required"`
}

JSON

package mainimport ("fmt""github.com/gin-gonic/gin""log"
)func main() {engine := gin.Default()//POSTengine.POST("/addUser", func(context *gin.Context) {fmt.Println(context.FullPath())var person Personcontext.BindJSON(&person)err := context.BindJSON(&person)if err != nil {log.Fatal(err.Error())return}fmt.Println(person.Username)context.Writer.Write([]byte("Add " + person.Username))})engine.Run()
}type Person struct {Username string `form:"username" binding:"required"`Phone    string `form:"phone"    binding:"required"`Password string `form:"password" binding:"required"`
}

💌JSON格式提交请求:

{"username":"Nike""phone":"13265496230""password":"1234"
}

多数据格式返回请求结果

[]byte切片

💌通过 context.Writer.Write([]byte(返回结果)) 实现,前文内容已经使用,Writer 是 gin 框架中封装的一个 ResponseWriter 接口类型

string

💌ResponseWriter 还封装了 WriteString 方法返回数据,通过 context.Writer.WriteString(返回结果) 实现。

package mainimport ("fmt""github.com/gin-gonic/gin"
)func main() {engine := gin.Default()//byte[]engine.GET("/hellobyte", func(context *gin.Context) {path := "请求路径:" + context.FullPath()fmt.Println(path)context.Writer.Write([]byte(path))})//stringengine.GET("/hellostring", func(context *gin.Context) {path := "请求路径:" + context.FullPath()fmt.Println(path)context.Writer.WriteString(path)})engine.Run()
}

JSON

💌JSON 格式规范使用的更为普遍,context 包含的 JSON 方法可以将结构体类型的数据转换成 JSON 格式的结构化数据,然后返回给客户端。 

package mainimport ("fmt""github.com/gin-gonic/gin"
)func main() {engine := gin.Default()engine.GET("/hellojson", func(context *gin.Context) {path := "请求路径:" + context.FullPath()fmt.Println(path)//200:正常 404:NOT FOUND 500:内部错误//map类型context.JSON(200, map[string]interface{}{"code":    1,"message": "OK","data":    path,})})//struct类型engine.GET("/hellostruct", func(context *gin.Context) {path := "请求路径:" + context.FullPath()fmt.Println(path)resp := Response{Code: 1, Message: "OK", Data: path}context.JSON(200, &resp)})engine.Run()
}type Response struct {Code    intMessage stringData    interface{}
}

HTML

package mainimport ("fmt""github.com/gin-gonic/gin""net/http"
)func main() {engine := gin.Default()//设置html目录engine.LoadHTMLGlob("./html/*")//静态文件目录engine.Static("/img", "./img")engine.GET("/hellohtml", func(context *gin.Context) {path := "请求路径:" + context.FullPath()fmt.Println(path)context.HTML(http.StatusOK, "index.html", gin.H{"path":  path,"title": "Hello!",})})engine.Run()
}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{{.title}}</title>
</head>
<body>
{{.path}}
<div><img src="../img/Miku.jpeg"></div>
</body>
</html>

路由分组

💌路由组是 router.Group 中的一个方法,用于对请求进行分组,相同模块的功能接口,可以使用路由组进行分类处理。

package mainimport ("fmt""github.com/gin-gonic/gin"
)func main() {engine := gin.Default()routerGroup := engine.Group("/user")routerGroup.POST("/register", registerHandle)routerGroup.DELETE("/:id", deleteHandle) engine.Run()
}func registerHandle(context *gin.Context) {path := "用户注册:" + context.FullPath()fmt.Println(path)context.Writer.WriteString(path)
}func deleteHandle(context *gin.Context) {path := "用户删除:" + context.FullPath()userID := context.Param("id")fmt.Println(path + " " + userID)context.Writer.WriteString(path + " " + userID)
}

🧡中间件的使用

💌在实际的业务开发和处理中,会有更复杂的业务和需求场景。一个完整的系统可能要包含鉴权认证、权限管理、安全检查、日志记录等多维度的系统支持,对于系统中的所有业务都适用,可以将一些通用业务抽离出来单独进行开发,然后以插件化的形式进行对接。这种方式既保证了系统功能的完整,同时又有效地将具体业务和系统功能进行解耦,还可以达到灵活配置的目的。 

💌自定义中间件有两条标准:

🍠类型为 func 函数

🍠返回值类型为 HandlerFunc

package mainimport ("fmt""github.com/gin-gonic/gin"
)func main() {engine := gin.Default()//engine.Use(RequestInfos()) //所有接口均可使用中间件engine.GET("/middle", func(context *gin.Context) {context.JSON(200, map[string]interface{}{"code": 1,"msg":  context.FullPath(),})})//只有指定接口可以使用engine.GET("/only", RequestInfos(), func(context *gin.Context) {fmt.Println("中断操作")context.JSON(200, map[string]interface{}{"code": 2,"msg":  context.FullPath(),})})engine.Run()
}// 打印请求信息的中间件
func RequestInfos() gin.HandlerFunc {return func(context *gin.Context) {path := context.FullPath()method := context.Request.Methodfmt.Println("请求路径:", path)fmt.Println("请求method:", method)context.Next() //中断操作,先执行主函数内容fmt.Println("状态码:", context.Writer.Status())}
}

 


http://chatgpt.dhexx.cn/article/vtH7u6r2.shtml

相关文章

golang学习之go web 开发

文章目录 一、hello world二、请求处理1、url参数处理2、form参数处理3、header参数处理 三、响应处理1、ResponseWriter 四、cookie五、session实现1、session id2、session的存储3、session过期4、实现代码1、session 操作代码2、web服务3、登录页面4、session数据展示页面 一…

FlexSlider图片轮播切换jQuery插件

下载地址 flexSlider是一款强大的图片轮播插件。参数说明animation: "slide", // String: ["fade"|"slide"]&#xff0c;动画效果easing: "swing", // String: 滚动动画计时函数direction: "horizonta…

jQuery FlexSlider插件一些使用上的小tips

最近做的一个需求&#xff0c;用到了jQuery FlexSlider这个插件&#xff0c;本以为一个算是已经比较成熟的插件&#xff0c;用起来应该没什么难度&#xff0c;然而真正用起来才发现&#xff0c;其实还是有些坑的&#xff0c;不过好在这个插件源代码写的比较好&#xff0c;比较好…

jquery.flexslider-min.js实现banner轮播图效果

查看演示 立即下载 插件描述&#xff1a; jquery图片轮播插件仿支付宝2013版全屏图片幻灯片淡出淡进切换效果 实现方法 引用jquery和flexslider.js到你的页面 <script type"text/javascript" src"js/jquery-1.7.2.min.js"></script> <sc…

Vue+Element-ui实例_使用flexslider插件设计横向时间线

下面是做了一个类似时间线(history事件线)的页面&#xff0c;主要是记录一下log&#xff0c;或者history的操作记录。 主要难点&#xff1a; &#xff08;1&#xff09;一般的插件时间线例如(elementUI中的el-timeline)就是纵向的时间线&#xff0c;如果数据过多的话&#xf…

flexSlider 图片轮播插件的使用(附参数设置)

前提&#xff1a;下载插件&#xff08;官网下载地址&#xff1a;http://flexslider.woothemes.com/ 请用IE打开&#xff0c;chrome可能打不开&#xff1b;其他下载地址&#xff1a;点击打开链接&#xff09;&#xff0c;并引入flexslider.css和jquery.flexslider-min.js文件(缺…

flex

水平垂直居中也算是 CSS 领域最为常见的一个问题了&#xff0c;不同场景下的方法也各不相同&#xff0c;各有优劣。嗯&#xff0c;下面这种应该算是最便捷的了&#xff1a; <div class"g-container"><div class"g-box"></div> </div…

轮播插件——flexslider

轮播插件——flexslider, 首先&#xff0c;当我们需要轮播插件的时候呢&#xff0c;去浏览器中找自己需要的轮播插件&#xff0c;比如&#xff0c;搜索关键词“JQuery轮播插件”&#xff0c;就会出来很多网站&#xff0c;选一个点进去&#xff0c;预览效果&#xff0c;然后下载…

重现Struts1的操纵classLoader漏洞

注&#xff1a;本文仅限技术研究&#xff0c;探讨&#xff0c;测试使用. 2014年4月29日爆出的struts的可操纵classLoader的漏洞&#xff0c; 横跨struts1和struts2的所有版本。 影响面和问题的严重性几乎可以和heartbleed相媲美。 struts2要严重一些&#xff0c;对于struts1&am…

Struts1、Struts2、Hibernate、Spring框架工作原理介绍

Struts1工作原理 Struts1工作原理图 1 、初始化&#xff1a; struts 框架的总控制器 ActionServlet 是一个 Servlet &#xff0c;它在 web.xml 中配置成自动启动的 Servlet &#xff0c;在启动时总控制器会读取配置文件 (struts-config.xml) 的配置信息&#xff…

Struts1 和 Struts2

关于Struts2的出现缘由和好处就不多说啦&#xff0c;看了几篇总结的不错的文章&#xff0c;整理下贴出来&#xff0c;共同学习了。 Action的区别 对于有着丰富的Struts1.x开发经验的朋友来说&#xff0c;都十分的清楚Action是整个Struts框架的核心内容&#xff0c;当然Struts2也…

Struts1的工作流程

Struts1的工作流程图如下所示&#xff1a; 其工作流程如下&#xff1a; 当Web服务器启动的时候&#xff0c;根据web.xml文件加载并初始化ActionServlet&#xff0c;根据配置ActionServlet的config参数信息&#xff0c;确定struts-config.xml配置文件存放的位置&#xff0c;并根…

struts2讲解

Struts2部分 1. JavaEE软件三层结构和MVC的区别&#xff1f; JavaEE软件三层机构是由sun公司提供JavaEE开发规范的&#xff1a;Web层(表现层)、业务逻辑层、数据持久层。【其中WEB层会使用前端控制器模式】 MVC是一种思想&#xff0c;是一种模式&#xff0c;将软件分为 Model…

Struts1和Struts2对比

最近学习了Struts1和Struts2.很多人、很多资料都提到。Struts2不是从Struts1发展而来的。Struts2的前身是WebWork。那它俩到底有多大的不同呢&#xff0c;看了一些资料&#xff0c;下边就来比较比较。 一、架构分析 Struts1的架构图&#xff1a; 执行流程&#xff1a; 1.…

Struts1.x使用入门

Struts1框架是apache公司的开源子项目&#xff0c;是基于mvc逻辑分层的web层框架实现。是出现最早的web层框架&#xff0c;应用最广发。Struts1框架重点关注的是控制层&#xff0c;对于视图层只是提供了大量的标签&#xff1b;对于model层的影响微乎其微。 本文也是本人初学st…

Struts1的路径映射详解

首先介绍下struts1种xml配置的相关概念&#xff1a; • Action 的path: ActionServlet 根据该属性来转发用户的请求&#xff0c;即将用户请求转发与之同名的Action 。同名的意思是:将请求的.do 后缀去掉&#xff0c;匹配Action 的path属性值。 • Action 的name: 此处的name 属…

Struts1框架轻易入门,经典示例

Struts1框架轻易入门&#xff0c;经典示例 版权申明&#xff1a;此文为作者原创&#xff0c;未经允许&#xff0c;请勿转载&#xff01; Struts工作原理及流程登录验证示例 Struts1 工作原理及流程 这是本人整理的一点材料&#xff0c;原理图为纯手工绘制&#xff0c;不喜勿喷&…

struts1框架基本(笔记)

在阿帕奇官网下载合适的struts1框架文件。 应用在显示层框架。 struts1与struts2虽然是一脉相承&#xff0c;但它们用法完全不一样。 struts2是在struts1与webwork基础上&#xff0c;发展的全新框架。 注&#xff1a;本文是在MyEclipse下进行的操作&#xff0c;不是之前的E…

Struts1介绍

struts&#xff1a;[strʌts]支柱; 撑杆; 支杆; 支撑; 趾高气扬的步态; 高视阔步的样子; 引入struts Model1结构如图1所示&#xff1a; Model1是一个以JSP文件为中心的模式&#xff0c;在这种模式中JSP页面不仅负责表现逻辑&#xff0c;也负责控制逻辑。专业书籍上称之为逻辑…

入门Struts1第一讲——Struts1入门就这么简单

现在终于进入框架的学习中了&#xff0c;后面还有好几个框架等待着我们呢&#xff01;我们先来学习Struts1框架&#xff0c;然后再过渡到Struts2框架的学习中。下面我们开始学习Struts1框架之旅。 Struts1简介 Struts1是Apache开发的一个web层的框架&#xff0c;它主要用于简…