Gin框架框架入门
Posted 知其黑、受其白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gin框架框架入门相关的知识,希望对你有一定的参考价值。
阅读目录
- 一、Gin 介绍
- 二、Gin 环境搭建
- 三、golang 程序的热加载
- 四、Gin 框架中的路由
- 五、Gin HTML 模板渲染
- 六、静态文件服务
- 七、路由详解
- 八、Gin 中自定义控制器
- 九、Gin 中间件
- 十、Gin 中自定义 Model
- 十一、Gin 文件上传
- 十二、Gin 中的 Cookie
- 十三、Gin 中的 Session
- 十四、Gin 中使用GORM 操作mysql 数据库
- 十五、原生SQL 和SQL 生成器
- 十六、Gin 中使用GORM 实现表关联查询
- 十七、GORM 中使用事务
- 十八、Gin 中使用go-ini 加载.ini 配置文件
一、Gin 介绍
Gin 是一个Go (Golang) 编写的轻量级 http web 框架,运行速度非常快,如果你是性能和高效的追求者,我们推荐你使用Gin 框架。
Gin 最擅长的就是Api 接口的高并发,如果项目的规模不大,业务相对简单,这个时候我们也推荐您使用Gin。
当某个接口的性能遭到较大挑战的时候,这个还是可以考虑使用Gin 重写接口。
Gin 也是一个流行的 golang Web 框架,Github Strat 量已经超过了50k。
Gin 的官网:https://gin-gonic.com/zh-cn/
Gin Github 地址:https://github.com/gin-gonic/gin
二、Gin 环境搭建
要安装Gin 软件包,需要先安装Go 并设置Go 工作区。
1、下载并安装gin:
go get -u github.com/gin-gonic/gin
2、将gin 引入到代码中:
import "github.com/gin-gonic/gin"
3.、(可选)如果使用诸如 http.StatusOK 之类的常量,则需要引入net/http 包:
import "net/http"
4、新建 main.go
配置路由
package main
import "github.com/gin-gonic/gin"
func main()
// 创建一个默认的路由引擎
r := gin.Default()
// 配置路由
r.GET("/", func(c *gin.Context)
c.JSON(200, gin.H
"message": "Hello worlds",
)
)
// 启动 HTTP 服务,默认在 0.0.0.0:8080 启动服务
r.Run()
5、运行你的项目
go run main.go
6、要改变默认启动的端口
r.Run(":9000")
三、golang 程序的热加载
所谓热加载就是当我们对代码进行修改时,程序能够自动重新加载并执行,这在我们开发中是非常便利的,可以快速进行代码测试,省去了每次手动重新编译。
beego 中我们可以使用官方给我们提供的bee 工具来热加载项目,但是gin 中并没有官方提供的热加载工具,这个时候我们要实现热加载就可以借助第三方的工具。
工具1(推荐):https://github.com/gravityblast/fresh
PS E:\\gormlearn\\gormtest> go get github.com/pilu/fresh
go: downloading github.com/pilu/fresh v0.0.0-20190826141211-0fa698148017
go: downloading github.com/mattn/go-colorable v0.1.13
go: downloading github.com/howeyc/fsnotify v0.9.0
go: downloading github.com/pilu/config v0.0.0-20131214182432-3eb99e6c0b9a
go: added github.com/howeyc/fsnotify v0.9.0
go: added github.com/mattn/go-colorable v0.1.13
go: added github.com/pilu/config v0.0.0-20131214182432-3eb99e6c0b9a
go: added github.com/pilu/fresh v0.0.0-20190826141211-0fa698148017
PS E:\\gormlearn\\gormtest>
工具2:https://github.com/codegangsta/gin
PS E:\\gormlearn\\gormtest> go get -u github.com/codegangsta/gin
go: downloading github.com/codegangsta/gin v0.0.0-20211113050330-71f90109db02
go: downloading github.com/urfave/cli v1.22.10
go: downloading github.com/mattn/go-shellwords v1.0.12
go: downloading github.com/codegangsta/envy v0.0.0-20141216192214-4b78388c8ce4
go: downloading github.com/0xAX/notificator v0.0.0-20220220101646-ee9b8921e557
go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d
go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.2
go: downloading github.com/cpuguy83/go-md2man v1.0.10
go: downloading github.com/russross/blackfriday/v2 v2.0.1
go: downloading github.com/russross/blackfriday/v2 v2.1.0
go: downloading github.com/russross/blackfriday v1.6.0
go: downloading github.com/shurcooL/sanitized_anchor_name v1.0.0
go: added github.com/0xAX/notificator v0.0.0-20220220101646-ee9b8921e557
go: added github.com/codegangsta/envy v0.0.0-20141216192214-4b78388c8ce4
go: added github.com/codegangsta/gin v0.0.0-20211113050330-71f90109db02
go: added github.com/cpuguy83/go-md2man/v2 v2.0.2
go: added github.com/mattn/go-shellwords v1.0.12
go: added github.com/russross/blackfriday/v2 v2.1.0
go: added github.com/shurcooL/sanitized_anchor_name v1.0.0
go: added github.com/urfave/cli v1.22.10
PS E:\\gormlearn\\gormtest>
四、Gin 框架中的路由
4.1、路由概述
路由(Routing)是由一个URI(或者叫路径)和一个特定的HTTP 方法(GET、POST 等)组成的,涉及到应用如何响应客户端对某个网站节点的访问。
RESTful API 是目前比较成熟的一套互联网应用程序的API 设计理论,所以我们设计我们的路由的时候建议参考RESTful API 指南。
在RESTful 架构中,每个网址代表一种资源,不同的请求方式表示执行不同的操作:
4.2、简单的路由配置
简单的路由配置(可以通过postman 测试)
当用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")
)
路由里面获取Get 传值
域名 /news?aid=20
r.GET("/news", func(c *gin.Context)
aid := c.Query("aid")
c.String(200, "aid=%s", aid)
)
动态路由
域名 /user/20
r.GET("/user/:uid", func(c *gin.Context)
uid := c.Param("uid")
c.String(200, "userID=%s", uid)
)
4.3、c.String()、c.JSON()、c.JSONP()、c.XML()、c.html()
返回一个字符串
package main
import (
"github.com/gin-gonic/gin"
)
func main()
r := gin.Default()
r.GET("/news", func(c *gin.Context)
aid := c.Query("aid")
c.String(200, "aid=%s", aid)
)
r.Run(":8080")
返回一个JSON 数据
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main()
r := gin.Default()
// gin.H 是map[string]interface的缩写
r.GET("/someJSON", func(c *gin.Context)
// 方式一:自己拼接JSON
c.JSON(http.StatusOK, gin.H"message": "Hello world!")
)
r.GET("/moreJSON", func(c *gin.Context)
// 方法二:使用结构体
var msg struct
Name string `json:"user"`
Message string
Age int
msg.Name = "IT chen"
msg.Message = "Hello world!"
msg.Age = 18
c.JSON(http.StatusOK, msg)
)
r.Run(":8080")
JSOPN
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main()
r := gin.Default()
r.GET("/JSONP", func(c *gin.Context)
data := map[string]interface
"foo": "bar",
// /JSONP?callback=x
// 将输出:x(\\"foo\\":\\"bar\\")
c.JSONP(http.StatusOK, data)
)
// 监听并在0.0.0.0:8080 上启动服务
r.Run(":8080")
返回XML 数据
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main()
r := gin.Default()
// gin.H 是map[string]interface的缩写
r.GET("/someXML", func(c *gin.Context)
// 方式一:自己拼接JSON
c.XML(http.StatusOK, gin.H"message": "Hello world!")
)
r.GET("/moreXML", func(c *gin.Context)
// 方法二:使用结构体
type MessageRecord struct
Name string
Message string
Age int
var msg MessageRecord
msg.Name = "IT chen"
msg.Message = "Hello world!"
msg.Age = 18
c.XML(http.StatusOK, msg)
)
r.Run(":8080")
渲染模板
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main()
r := gin.Default()
// 配置模板文件
r.LoadHTMLGlob("templates/*")
r.GET("/a", func(c *gin.Context)
c.HTML(http.StatusOK,
"index.html",
map[string]interface"title": "前台首页")
)
r.Run(":8080")
Administrator@DESKTOP-BT1MKQ3 MINGW64 /e/gormlearn
$ tree -C
.
`-- gormtest
|-- go.mod
|-- go.sum
|-- main.go
`-- templates
`-- index.html
2 directories, 4 files
Administrator@DESKTOP-BT1MKQ3 MINGW64 /e/gormlearn
$
五、Gin HTML 模板渲染
5.1、全部模板放在一个目录里面的配置方法
1、我们首先在项目根目录新建 templates
文件夹,然后在文件夹中新建 index.html
<!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>
<h1>这是一个html 模板</h1>
<h3>.title</h3>
</body>
</html>
2、Gin 框架中使用 c.HTML
可以渲染模板,渲染模板前需要使用 LoadHTMLGlob()
或者 LoadHTMLFiles()
方法加载模板。
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main()
r := gin.Default()
// 配置模板文件
r.LoadHTMLGlob("templates/*")
r.GET("/", func(c *gin.Context)
c.HTML(http.StatusOK,
"index.html",
map[string]interface"title": "前台首页")
)
// r.LoadHTMLFiles("templates/index.html", "templates/index.html")
r.Run(":8080")
Administrator@DESKTOP-BT1MKQ3 MINGW64 /e/gormlearn
$ tree -C
.
`-- gormtest
|-- go.mod
|-- go.sum
|-- main.go
`-- templates
`-- index.html
2 directories, 4 files
Administrator@DESKTOP-BT1MKQ3 MINGW64 /e/gormlearn
$
5.2、模板放在不同目录里面的配置方法
Gin 框架中如果不同目录下面有同名模板的话我们需要使用下面方法加载模板。
注意:定义模板的时候需要通过 define
定义名称。
templates/admin/index.html
<!-- 相当于给模板定义一个名字define end 成对出现-->
define "admin/index.html"
<!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>
<h1>后台模板</h1>
<h3>.title</h3>
</body>
</html>
end
templates/home/index.html
<!-- 相当于给模板定义一个名字define end 成对出现-->
define "home/index.html"
<!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>
<h1>home</h1>
<h3>.title</h3>
</body>
</html>
end
业务逻辑
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main()
router := gin.Default()
router.LoadHTMLGlob("templates/**/*")
router.GET("/", func(c *gin.Context)
c.HTML(http.StatusOK, "home/index.html", gin.H
"title": "前台首页",
)
)
router.GET("/admin", func(c *gin.Context)
c.HTML(http.StatusOK, "admin/index.html", gin.H
"title": "后台首页",
)
)
router.Run(":8080")
注意:如果模板在多级目录里面的话需要这样配置r.LoadHTMLGlob("templates/**/**/*") /**
表示目录。
Administrator@DESKTOP-BT1MKQ3 MINGW64 /e/gormlearn
$ tree -C
.
`-- gormtest
|-- go.mod
|-- go.sum
|-- main.go
`-- templates
|-- admin
| `-- index.html
|-- home
| `-- index.html
`-- index.html
4 directories, 6 files
Administrator@DESKTOP-BT1MKQ3 MINGW64 /e/gormlearn
$
5.3、gin 模板基本语法
1、. 输出数据
模板语法都包含在 和
中间,其中 .
中的点表示当前对象。
当我们传入一个结构体对象时,我们可以根据 .
来访问结构体的对应字段。
例如:业务逻辑
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
type UserInfo struct
Name string
Gender string
Age int
func main()
router := gin.Default()
router.LoadHTMLGlob("templates/**/*")
user := UserInfo
Name: "张三",
Gender: "男",
Age: 18,
router.GET("/", func(c *gin.Context)
c.HTML(http.StatusOK, "home/index.html", map[string]interface
"title": "前台首页",
"user": user,
)
)
router.Run(":8080")
模板:E:\\gormlearn\\gormtest\\templates\\home\\index.html
<!-- 相当于给模板定义一个名字define end 成对出现-->
define "home/index.html"
<!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>
<h1>前台模板</h1>
<h3Gin框架框架入门