Gin 框架简介
- Gin是Golang应用最为广泛的框架之一
- Gin是轻量级http web框架,简易而高性能,专注于处理高并发场景
Gin框架环境搭建
- 基于已完成的Go环境, 参考 go mod 环境搭建 ↓
- https://blog.csdn.net/Tyro_java/article/details/135297367
- 在初始化好的 go mod 工程内执行安装Gin
- $
go get -u github.com/gin-gonic/gin
- $
- 创建 main.go,并引入 gin
import ( "github.com/gin-gonic/gin" )
Gin框架搭建并运行一个Web应用
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
// 创建一个默认的路由引擎
r := gin.Default()
// 配置根路由
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
// c.JSON:返回 JSON 格式的数据
"message": "Hello Gin!",
})
})
// 启动 HTTP 服务,默认在 0.0.0.0:8080 启动服务
r.Run()
// r.Run(":8081") // 这样可以改变运行的端口
}
- 运行:$
go run main.go
- 访问: http://localhost:8080
- 这是最简单的Gin框架运行效果,页面输出
基于RESTful API的路由响应及参数处理
1 )一般常用的 method 如下,基于此设计路由响应
GET(SELECT)
从服务器取出资源(一项或多项)POST(CREATE)
在服务器新建一个资源PUT(UPDATE)
在服务器更新资源(客户端提供改变后的完整资源)DELETE(DELETE)
从服务器删除资源
路由基础配置如下:
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
var statusOK = http.StatusOK
func main() {
// 创建一个默认的路由引擎
r := gin.Default()
//配置路由
r.GET("/", func(c *gin.Context) {
c.String(statusOK, "Hello:%v", "gin")
})
r.GET("/user", func(c *gin.Context) {
c.String(statusOK, "User")
})
r.POST("/add", func(c *gin.Context) {
c.String(statusOK, "add Post")
})
r.PUT("/edit", func(c *gin.Context) {
c.String(statusOK, "edit Put")
})
r.DELETE("/delete", func(c *gin.Context) {
c.String(statusOK, "delete")
})
r.Run() //启动一个web服务
}
2 )参数匹配处理如下:
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
var statusOK = http.StatusOK
func main() {
// 创建一个默认的路由引擎
r := gin.Default()
//配置路由
r.GET("/", func(c *gin.Context) {
c.String(statusOK, "Hello:%v", "gin")
})
// 访问示例:/user?id=3
r.GET("/user", func(c *gin.Context) {
id := c.Query("id")
c.String(statusOK, "User: %s", id)
})
// 访问示例:/book/5
r.GET("/book/:id", func(c *gin.Context) {
id := c.Param("id")
c.String(statusOK, "Book: %s", id)
})
r.Run() //启动一个web服务
}
- 这里有两种参数类型,Query 和 Param 两种
- Query不涉及路由处理
- Param 要配置路由,属于动态路由
- 这里用GET形式演示,其他形式获取方式一致
响应不同类型的数据
1 )这里声明下目录结构,方便举例
yourGinProject/ ······························· 根目录
├── go.mod ·································· go mod 文件
├── go.sum ·································· go sum 文件
├── main.go ································· main 文件
└── tpls ····································· html模板目录
└──── news.html ······················· 新闻页面模板文件
2 )全量代码演示
main.go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
type User struct {
Id int `json:"id"`
Name string `json:"name"`
Hobby string `json:"hobby"`
}
var statusOK = http.StatusOK
func main() {
// 创建一个默认的路由引擎
r := gin.Default()
// 配置模板的文件
r.LoadHTMLGlob("tpls/*")
// r.LoadHTMLFiles("tpls/news.html") // 同上,二选一
// 1. 响应String报文,根路由
r.GET("/", func(c *gin.Context) {
c.String(statusOK, "Welcome to %v", "Home Page")
})
// 2. 响应Json报文,3种方式
r.GET("/json1", func(c *gin.Context) {
c.JSON(statusOK, map[string]interface{} {
"success": true,
"msg": "Gin JSON 1",
})
})
r.GET("/json2", func(c *gin.Context) {
c.JSON(statusOK, gin.H{
"success": true,
"msg": "Gin JSON 2",
})
})
r.GET("/json3", func(c *gin.Context) {
u := &User{
Id: 1,
Name: "Wang",
Hobby: "swimming",
}
c.JSON(statusOK, u)
})
// 3. 响应JSONP报文
r.GET("/jsonp", func(c *gin.Context) {
u := &User{
Id: 2,
Name: "Lee",
Hobby: "ping pang",
}
c.JSONP(statusOK, u)
})
// 4. 响应xml报文
r.GET("/xml", func(c *gin.Context) {
c.XML(statusOK, gin.H{
"success": true,
"msg": "Hello XML",
})
})
// 5. 响应html报文
r.GET("/news", func(c *gin.Context) {
// r.LoadHTMLGlob("tpls/*") // 可在这里配置,推荐在顶层统一配置
// r.LoadHTMLFiles("tpls/news.html") 二选一
c.HTML(statusOK, "news.html", gin.H{
"title": "新闻标题",
"content": "这是详细的新闻内容",
})
})
r.Run()
}
3 )不同响应释义
-
3.1 响应String报文,
Context.String
- 访问 /
- 响应: Welcome to Home Page
-
3.2 响应Json报文,
Context.JSON
- 访问:/json1, /json2, json3
- 这里设定了3种方式, 它们的目的具有一致性
map[string]interface{}
gin.H
&User
-
3.3 响应JSONP报文,
Context.JSONP
- 访问:/jsonp?callback=fn 这里的 fn 可以是任意字符串
- fn 作为函数名挂载到浏览器window对象
- 响应
fn({"id":2,"name":"Lee","hobby":"ping pang"});
- 访问:/jsonp?callback=fn 这里的 fn 可以是任意字符串
-
3.4 响应XML报文,
Context.XML
- 访问 /xml, 并响应
<map> <success>true</success> <msg>Hello XML</msg> </map>
- 访问 /xml, 并响应
-
3.5 响应html报文,
Context.HTML
- 访问 /news
- 注意 tpls/news.html 中的配置
- 这里是最简洁配置,生产环境请使用完整的html文档结构
<h1>News Page</h1> <h3>标题:{{.title}}</h3> <p>内容:{{.content}}</p>
- 这里是最简洁配置,生产环境请使用完整的html文档结构
r.LoadHTMLGlob("tpls/*")
可配置在当前,也可配置在顶部,位置选其一r.LoadHTMLFiles("tpls/news.html")
这个和上面二选一,但是这里使用逗号,
分隔多个,可逐个指定- 这两个API在生产环境配置到顶部
Go搭建Web应用中实用的热更工具(辅助开发)
- 工具1 fresh:https://github.com/gravityblast/fresh
- 安装 $
go get github.com/pilu/fresh
- 执行 $
fresh
- 注意,这类全局工具,如果找不到命令
- 请检查 $GOPATH, 并将 $GOPATH/bin 加入 $PATH
- 别忘记 source 一下配置,如:$
source ~/.bash_profile
- 安装 $
- 工具2:https://github.com/codegangsta/gin
- $
go install github.com/codegangsta/gin@latest
- 执行 $
gin run main.go
- $
- 注意,两种安装的方式不同,官方指定不同的安装方式
- 参考:https://blog.csdn.net/Tyro_java/article/details/135299131
- 更推荐 fresh,更高效方便