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 软件包,需要先安装 Go 并设置 Go 工作区
go get -u github.com/gin-gonic/gin
由于网络原因国内部分用户可能没法直接下载第三方包,go get 失败,Golang Gin中没法下载第三方包解决办法如下:
//打开终端并执行
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
import "github.com/gin-gonic/gin"
import "net/http"
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
// 创建gin的默认路由引擎
r := gin.Default()
// 配置路由
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{ // c.JSON:返回 JSON 格式的数据
"message": "Hello world!", })
})
// 浏览器访问请求127.0.0.1:8080/ping路由时,调用回调函数
r.GET("/ping", func(c *gin.Context) {
//浏览器输出
//c.JSON(200, gin.H{
// "message": "pong",
//})
c.String(http.StatusOK, "值:%v", "你好")
})
//监听并在 0.0.0.0:8080 上启动服务(启动一个web服务)
r.Run()
// 监听并在 0.0.0.0:8000 上启动服务(启动一个web服务)
//r.Run("8000")
}
go run main.go
r.Run(":9000")
所谓热加载就是当对代码进行修改时,程序能够自动重新加载并执行,这在开发中
是非常便利的,可以快速进行代码测试,省去了每次手动重新编译,beego 中可以使用官方给提供bee工具来热加载项目,但是 gin 中并没有官方提供的热加载工具,这个时候要实现热加载就可以借助第三方的工具
工具 1(推荐):https://github.com/gravityblast/fresh
//进入终端执行
go get github.com/pilu/fresh
//然后运行命令
fresh
//或者进入终端执行
go install github.com/pilu/fresh@latest
//然后运行命令
fresh
工具 2:https://github.com/codegangsta/gin
//进入终端执行
go get -u github.com/codegangsta/gin
//然后运行命令
gin run main.go
路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等)
组成的,涉及到应用如何响应客户端对某个网站节点的访问 ,RESTful API 是目前比较成熟的一套互联网应用程序的 API 设计理论,所以在设计路由的时候建议参考 RESTful API 指南,在 RESTful 架构中,每个网址代表一种资源,不同的请求方式表示执行不同的操作:
GET(SELECT) |
从服务器取出资源(一项或多项) |
POST(CREATE) |
在服务器新建一个资源 |
PUT(UPDATE) |
在服务器更新资源(客户端提供改变后的完整资源) |
DELETE(DELETE) |
从服务器删除资源 |
当用 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)
})
完整的代码案例如下:
package main
import (
_ "fmt"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default() // 创建gin的默认路由引擎
//配置路由
// 浏览器访问请求127.0.0.1:8080/ping路由时,调用回调函数
r.GET("/ping", func(c *gin.Context) {
//浏览器输出
//c.JSON(200, gin.H{
// "message": "pong",
//})
c.String(http.StatusOK, "值:%v", "你好")
})
r.GET("/news", func(c *gin.Context) {
//使用http.StatusOK状态码
c.String(http.StatusOK, "新闻页11面")
})
r.POST("/add", func(c *gin.Context) {
c.String(200, "这是一个POST请求,主要用于增加数据")
})
r.PUT("/edit", func(c *gin.Context) {
c.String(200, "这是一个PUT请求,主要用于修改数据")
})
r.DELETE("/delete", func(c *gin.Context) {
c.String(200, "这是一个DELETE请求,主要用于增删除数据")
})
r.Run() // 监听并在 0.0.0.0:8080 上启动服务(启动一个web服务)
}
返回一个字符串
r.GET("/news", func(c *gin.Context) {
aid := c.Query("aid")
c.String(200, "aid=%s", aid)
})
返回一个 JSON 数据
//方法一:自己拼接JSON
r.GET("/json", func(c *gin.Context) {
//返回json数据,使用 map[string]interface
//c.JSON(返回的状态码, 任意类型的数据(如:map,struct,...)
c.JSON(200, map[string]interface{}{
"success": true,
"msg": "你好",
})
})
//方法二:gin中的H函数
r.GET("/json2", func(c *gin.Context) {
//返回json数据,使用gin中的H函数, gin.H 是 map[string]interface{}的缩写
c.JSON(200, gin.H{
"success": true,
"msg": "你好gin",
})
})
//方法三:使用结构体
r.GET("/json3", func(c *gin.Context) {
//实例化一个结构体
a := &Article{
Title: "标题",
Desc: "说明",
Content: "内容",
}
c.JSON(200, a)
})
JSOPN: jsonp请求 主要用来解决跨域问题
//jsonp请求 主要用来解决跨域问题
//http://127.0.0.1:8080/jsonp?callback=call
//call({"title":"标题-jsonp","desc":"说明-jsonp","content":"内容-jsonp"});
r.GET("/jsonp", func(c *gin.Context) {
//实例化一个结构体
a := &Article{
Title: "标题-jsonp",
Desc: "说明-jsonp",
Content: "内容-jsonp",
}
c.JSONP(200, a)
})
返回 XML 数据
//方法一:使用gin.H返回
r.GET("/xml", func(c *gin.Context) {
c.XML(http.StatusOK, gin.H{
"success": true,
"msg": "成功xml",
})
})
//方法二:使用结构体
r.GET("/xmlStruct", func(c *gin.Context) {
//实例化一个结构体
a := &Article{
Title: "标题-xmlStruct",
Desc: "说明-xmlStruct",
Content: "内容-xmlStruct",
}
c.XML(200, a)
})
返回HTML数据
//初始化路由
r := gin.Default()
//加载templates文件中所有模板文件,以便后续c.HTML()渲染文件时使用
r.LoadHTMLGlob("templates/*")
r.GET("/news", func(c *gin.Context) {
//使用模板文件渲染HTML文件
//前提: r.LoadHTMLGlob("templates/*")
//HTML(状态码, 要渲染的文件名, 加载的参数)
c.HTML(http.StatusOK, "news.html", gin.H{
"title": "我是一个news",
})
})
完整代码案例如下:
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type Article struct {
Title string `json:"title"`
Desc string `json:"desc"`
Content string `json:"content"`
}
func main() {
//初始化路由
r := gin.Default()
//加载templates文件中所有模板文件,以便后续c.HTML()渲染文件时使用
r.LoadHTMLGlob("templates/*")
//配置路由
r.GET("/", func(c *gin.Context) {
c.String(200, "首页")
})
r.GET("/json", func(c *gin.Context) {
//返回json数据,使用 map[string]interface
//c.JSON(返回的状态码, 任意类型的数据(如:map,struct,...)
c.JSON(200, map[string]interface{}{
"success": true,
"msg": "你好",
})
})
r.GET("/json2", func(c *gin.Context) {
//返回json数据,使用gin中的H函数
c.JSON(200, gin.H{
"success": true,
"msg": "你好gin",
})
})
r.GET("/json3", func(c *gin.Context) {
//实例化一个结构体
a := &Article{
Title: "标题",
Desc: "说明",
Content: "内容",
}
c.JSON(200, a)
})
//jsonp请求 主要用来解决跨域问题
//http://127.0.0.1:8080/jsonp?callback=call
//call({"title":"标题-jsonp","desc":"说明-jsonp","content":"内容-jsonp"});
r.GET("/jsonp", func(c *gin.Context) {
//实例化一个结构体
a := &Article{
Title: "标题-jsonp",
Desc: "说明-jsonp",
Content: "内容-jsonp",
}
c.JSONP(200, a)
})
r.GET("/xml", func(c *gin.Context) {
c.XML(http.StatusOK, gin.H{
"success": true,
"msg": "成功xml",
})
})
r.GET("/news", func(c *gin.Context) {
//使用模板文件渲染HTML文件
//前提: r.LoadHTMLGlob("templates/*")
//HTML(状态码, 要渲染的文件名, 加载的参数)
c.HTML(http.StatusOK, "news.html", gin.H{
"title": "我是一个news",
})
})
r.GET("/goods", func(c *gin.Context) {
//使用模板文件渲染HTML文件
//前提: r.LoadHTMLGlob("templates/*")
//HTML(状态码, 要渲染的文件名, 加载的参数)
c.HTML(http.StatusOK, "goods.html", gin.H{
"title": "我是一个goods",
"price": 12.99,
})
})
r.Run() // 启动一个web服务
}
[下一节][golang gin框架] 2.Gin HTML模板渲染以及模板语法,自定义模板函数,静态文件服务