网络型网站分为,西安小程序制作,南宁网站建设 传导,身边的网络营销案例1. 什么是Gin框架
Gin框架#xff1a;是一个由 Golang 语言开发的 web 框架#xff0c;能够极大提高开发 web 应用的效率#xff01; 1.1 什么是web框架
web框架体系图#xff08;前后端不分离#xff09;如下图所示#xff1a; 从上图中我们可以发现一个Web框架最重要…1. 什么是Gin框架
Gin框架是一个由 Golang 语言开发的 web 框架能够极大提高开发 web 应用的效率 1.1 什么是web框架
web框架体系图前后端不分离如下图所示 从上图中我们可以发现一个Web框架最重要的一些组成部分
HTTP解析/封装系统解析HTTP请求以及将响应构造为HTTP请求等任务交由web框架来完成路由系统将一个请求路由给某一个指定的处理器函数逻辑处理系统是后端人员需要关注的重点区域编写具体业务逻辑以及链接数据库模板引擎前后端不分离将数据嵌入到HTML模板中构建动态页面
简单来说web框架将一些繁琐且与业务逻辑无关的部分封装起来供开发者使用这样开发人员只需要关注业务逻辑层的实现
1.2 web框架两种架构模式
常见的 web 架构模式有两种
前后端不分离前后端分离
上面已经介绍了前后端不分离的架构体系图下图是前后端分离的架构图 可以看出主要区别在于后端没有了模板引擎意味着HTML页面、图片等static静态资源全部都在前端服务器部署如nginx后端服务器只负责编写接口进行业务逻辑处理然后将前端所需的数据暴露成接口返回不和页面打任何交道
2. Gin框架
2.1 Gin框架如何安装
在Go 1.11之后引入了包管理机制我们就可以使用go mod tidy一键将代码中所需导入的包从远程服务器下载到本地
package mainimport github.com/gin-gonic/ginfunc main() {// 获取引擎对象r : gin.Default()// 设置路由r.GET(/hello, func(c *gin.Context) {c.String(200, Hello Gin)})// 启动r.Run(:8080)
}编写完上述代码以后在控制台输入以下命令
go mod init gin_first包管理初始化go mod tidy下载所需依赖 看到上述信息就表明 gin 框架已经引入完毕可以正式编写代码啦~
2.2 Gin框架的路由系统
2.2.1 基本使用
其实在 2.1 节我们已经初步使用过路由系统了
// 设置路由
r.GET(/hello, func(c *gin.Context) {c.String(200, hello gin)
})基本语法r.操作方法(url, 处理器函数)
操作方法引擎对象基本支持所有的HTTP请求方法比如GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONS以及Any任何请求、NoRoute(没有请求对应上时访问)url表示请求对应的路径处理器函数表示请求路径为/hello时映射到该处理器函数进行执行
现在我们通过浏览器使用GET请求访问路径http://localhost:8080/hello 2.2.2 路由分组
有时候我们希望对一个 url 路径做更统一化的管理比如/user/login和/user/register实际上都是在/user路径下的子路由这个时候就需要引入 路由分组
基本语法子路由对象 : r.Group(根路由)
package mainimport github.com/gin-gonic/ginfunc main() {// 获取引擎对象r : gin.Default()// 设置根路由userRouter : r.Group(/user){userRouter.GET(/login, func(ctx *gin.Context) {ctx.String(200, /user/login)})userRouter.GET(/register, func(ctx *gin.Context) {ctx.String(200, /user/register)})}// 启动r.Run(:8080)
}2.3 Gin框架获取参数
2.3.1 获取基本信息
2.3.1.1 获取请求方法
比如在Any请求内部想要知道具体请求方法可以使用
基本语法var method string ctx.Request.Method
package mainimport (fmtgithub.com/gin-gonic/gin
)func handleFunc(ctx *gin.Context) {// 获取请求方法method : ctx.Request.Methodfmt.Println(请求方法是: method)ctx.String(200, request ok)
}func main() {// 获取引擎对象r : gin.Default()// 设置路由r.Any(/method, handleFunc)// 启动r.Run(:8080)
}
代码运行结果 2.3.1.2 获取请求URL
基本语法var url string ctx.Request.URL
package mainimport (fmtgithub.com/gin-gonic/gin
)func handleFunc(ctx *gin.Context) {// 获取请求URLvar url string ctx.Request.URL.String()fmt.Println(请求URL是: url)ctx.String(200, request ok)
}func main() {// 获取引擎对象r : gin.Default()// 设置路由r.GET(/url, handleFunc)// 启动r.Run(:8080)
}
代码运行结果 2.3.1.3 获取远程IP地址
基本语法
方式一var remoteAddr string ctx.Request.RemoteAddr包含端口方式二var remoteAddr string ctx.ClientIP()不包含端口
package mainimport (fmtgithub.com/gin-gonic/gin
)func handleFunc1(ctx *gin.Context) {// 获取远程ipvar addr string ctx.Request.RemoteAddrfmt.Println(远程ip:, addr)ctx.String(200, request ok)
}func handleFunc2(ctx *gin.Context) {// 获取远程ipvar addr string ctx.ClientIP()fmt.Println(远程ip:, addr)ctx.String(200, request ok)
}func main() {// 获取引擎对象r : gin.Default()// 设置路由r.GET(/addr1, handleFunc1)r.GET(/addr2, handleFunc2)// 启动r.Run(:8080)
}
代码运行结果 2.3.1.4 获取请求头信息
本语法var headerInfo string ctx.GetHeader(键)
package mainimport (fmtgithub.com/gin-gonic/gin
)func handleFunc(ctx *gin.Context) {// 获取指定请求头var userAgent string ctx.GetHeader(User-Agent)fmt.Println(Content-Type:, userAgent)ctx.String(200, request ok)
}func main() {// 获取引擎对象r : gin.Default()// 设置路由r.GET(/header, handleFunc)// 启动r.Run(:8080)
}
代码运行结果 2.3.2 获取请求数据
2.3.2.1 获取查询字符串内容
通常来说使用 GET 请求发送请求都会将数据放置在查询字符串位置
方式一 var content string ctx.Query(键)方式二var content string ctx.DefaultQuery(键, 缺省值)如果不存在则使用默认值填充方式三value, ok : ctx.GetQuery(键)可以通过ok判断是否存在键
package mainimport (fmtgithub.com/gin-gonic/gin
)func handleFunc1(ctx *gin.Context) {// 获取查询字符串数据var username ctx.Query(username)var pwd ctx.Query(pwd)fmt.Println(username:, username)fmt.Println(pwd:, pwd)ctx.String(200, request ok)
}func handleFunc2(ctx *gin.Context) {// 获取查询字符串数据var user ctx.DefaultQuery(user, wjj)fmt.Println(user:, user)ctx.String(200, request ok)
}func handleFunc3(ctx *gin.Context) {// 获取查询字符串数据user, exists : ctx.GetQuery(user)if exists {fmt.Println(键存在值为:, user)} else {fmt.Println(键不存在!)}ctx.String(200, request ok)
}func main() {// 获取引擎对象r : gin.Default()// 设置路由r.GET(/queryString1, handleFunc1)r.GET(/queryString2, handleFunc2)r.GET(/queryString3, handleFunc3)// 启动r.Run(:8080)
}
程序运行结果 2.3.2.2 获取表单数据
前端使用 form表单 提交发送请求此时Content-Type为x-www-form-urlencoded可以使用PostForm获取表单内容
方式一 var content string ctx.PostForm(键)方式二var content string ctx.DefaultPostForm(键, 缺省值)如果不存在则使用默认值填充方式三value, ok : ctx.GetPostForm(键)可以通过ok判断是否存在键
package mainimport (fmtgithub.com/gin-gonic/gin
)func handleFunc1(ctx *gin.Context) {// 获取查询字符串数据var username ctx.PostForm(username)var pwd ctx.PostForm(pwd)fmt.Println(username:, username)fmt.Println(pwd:, pwd)ctx.String(200, request ok)
}func handleFunc2(ctx *gin.Context) {// 获取查询字符串数据var user ctx.DefaultPostForm(user, wjj)fmt.Println(user:, user)ctx.String(200, request ok)
}func handleFunc3(ctx *gin.Context) {// 获取查询字符串数据user, exists : ctx.GetPostForm(user)if exists {fmt.Println(键存在值为:, user)} else {fmt.Println(键不存在!)}ctx.String(200, request ok)
}func main() {// 获取引擎对象r : gin.Default()// 加载HTML资源r.LoadHTMLGlob(templates/*)// 设置路由r.GET(/, func(ctx *gin.Context) {ctx.HTML(200, index.html, nil)})r.POST(/postform1, handleFunc1)r.POST(/postform2, handleFunc2)r.POST(/postform3, handleFunc3)// 启动r.Run(:8080)
}
程序运行结果 2.3.2.3 获取JSON请求体数据
Go语言没有提供类似于 PostForm、Query 这样的API直接获取JSON数据但是Go提供了ShouldBind函数可以将 json 类型的数据自动映射到指定的结构体对象上
语法格式ctx.ShouldBind(结构体对象)
package mainimport (fmtgithub.com/gin-gonic/gin
)type Student struct {Username string json:usernamePassword string json:password
}func main() {// 获取引擎对象r : gin.Default()// 设置路由r.POST(/, func(ctx *gin.Context) {// 使用ShouldBind函数获取JSON数据var student Studenterr : ctx.ShouldBind(student)if err ! nil {fmt.Println(err)ctx.String(500, 解析错误)} else {fmt.Println(student)ctx.String(200, request ok)}})// 启动r.Run(:8080)
}
程序运行结果 2.4 Gin框架返回响应
2.4.1 返回HTML页面
语法格式ctx.HTML(响应状态码, 页面, 数据对象)
响应状态码对应的HTTP状态码页面具体页面路径数据对象与模板引擎相关后续章节介绍
package mainimport github.com/gin-gonic/ginfunc main() {// 获取引擎对象r : gin.Default()// 加载模板文件r.LoadHTMLGlob(templates/*)// 设置路由r.GET(/, func(ctx *gin.Context) {// 返回首页ctx.HTML(202, index.html, nil)})// 启动r.Run(:8080)
}
程序运行结果 2.4.2 返回String类型
语法格式ctx.String(响应状态码, 格式化字符串)
响应状态码对应的HTTP状态码格式化字符串具体返回的文本内容
package mainimport github.com/gin-gonic/ginfunc main() {// 获取引擎对象r : gin.Default()// 设置路由r.GET(/, func(ctx *gin.Context) {// 返回sring类型ctx.String(200, string 类型)})// 启动r.Run(:8080)
}
程序运行结果 2.4.3 返回JSON类型
语法格式ctx.JSON(响应状态码, gin.H对象)
响应状态码对应的HTTP状态码gin.H对象具体返回JSON格式对象
package mainimport github.com/gin-gonic/ginfunc main() {// 获取引擎对象r : gin.Default()// 设置路由r.GET(/, func(ctx *gin.Context) {// 返回json类型ctx.JSON(200, gin.H{name: wjj,age: 21,})})// 启动r.Run(:8080)
}
程序运行结果 2.4.4 返回XML类型
语法格式ctx.XML(响应状态码, gin.H对象)
响应状态码对应的HTTP状态码gin.H对象具体返回XML格式对象
package mainimport github.com/gin-gonic/ginfunc main() {// 获取引擎对象r : gin.Default()// 设置路由r.GET(/, func(ctx *gin.Context) {ctx.XML(200, gin.H{name: wjj,age: 21,})})// 启动r.Run(:8080)
}
程序运行结果