web框架 轻量级 干净 (相比goframe来说的)
初始化
推荐阅读
gin-gonic.com/zh-cn/ 官方中文框架文档
初始化go
go mod init 填写自己喜欢的名字
初始化框架
go get -u github.com/gin-gonic/gin
快速入门
package main
import "github.com/gin-gonic/gin"
func main() {
router := gin.Default()
router.GET("/ping", func(c *gin.Context) { // /ping 就是路径
c.JSON(200, gin.H{ //返回的结构体
"message": "pong", //json结构体的内容
})
})
这里的api结构是这样的。 GET(relativePath string, handlers ...HandlerFunc)
// HandlerFunc defines the handler used by gin middleware as return value.
handlers 就是 返回值
router.Run() // 默认监听 0.0.0.0:8080
}
这就是一个简单的Gin应用
go run main.go
运行 浏览器访问
API的初步使用
gin.H
gin.H 在源码中其实就是** Map[string]interface.** 这样的结构 其实使用map[string]interface 也可以
GET请求
router.GET("/hello", func(c *gin.Context) {
name := c.Query("name")
if name == "" {
name = "World"
}
c.JSON(http.StatusOK, gin.H{
"message": "Hello, " + name + "!",
})
})
就是访问http://localhost:8080/hello的时候 其实就是调用的这个接口了。 然后返回的 就是"message": "Hello, " + name + "!"。 其中 **name := c.Query("name")。 是get请求当中的获取参数的方法 这样的话 就可以读取到 url中的数据 然后进行一系列的操作了 **
POST请求
router.POST("/hello", func(c *gin.Context) {
name := c.PostForm("name")
age := c.DefaultPostForm("age", "20")//如果没有值 就使用默认值
if name == "" {
name = "World"
}
c.JSON(http.StatusOK, gin.H{
"message": "Hello, " + name + "!",
})
})
像这样的 其实就是post请求 然后c.PostForm 就是获取表单当中的数据
路由组
// 简单的路由组: v2
{
v2 := router.Group("/v2")
v2.POST("/login", loginEndpoint)
v2.POST("/submit", submitEndpoint)
v2.POST("/read", readEndpoint)
}
函数式的路由组
func InitUser(router *gin.Engine) {
user := router.Group("/user")
{
user.GET("/hello", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "Hello, World!"})
})
}
}
main.go注册
package main
import (
"github.com/gin-gonic/gin"
"gin-exe/router"
)
func main() {
router := gin.Default()
// 注册 v1 和 user 路由
router.InitV1(router)
router.InitUser(router)
// 启动服务
router.Run(":8080")
}
中间件
上述说道 这个
v2.POST("/login", loginEndpoint)
其实真实的接口样子是
**GET(relativePath string, handlers ...HandlerFunc) **
所以呢。这个 handler不仅仅可以填写我们的controller。还可以填写中间介 来进行一些权限校验啊之类的。 下面是一个小demo
package router
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
)
func Middleware(c *gin.Context) {
fmt.Println("Middleware")
c.Next()
fmt.Println("Middleware End")
}
func Middleware2(c *gin.Context) {
fmt.Println("Middleware2")
c.Next()
fmt.Println("Middleware2 End")
}
func V1(router *gin.Engine) {
v1 := router.Group("/v1")
{
v1.GET("/hello", Middleware,Middleware2, func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "Hello, World!"})
})
}
}
就像这样的。啊 就是一个中间介 就可以进行一些操作
中间件 携程问题
在中间介 使用携程的时候 不能直接使用原始的上下文。应该使用 副本
gin.Context.Copy(). 这个副本还是只读的
func main() {
router := gin.Default()
router.GET("/long_async", func(c *gin.Context) {
// 创建在 goroutine 中使用的副本
cCp := c.Copy()
go func() {
// 用 time.Sleep() 模拟一个长任务。
time.Sleep(5 * time.Second)
// 请注意您使用的是复制的上下文 "cCp",这一点很重要
log.Println("Done! in path " + cCp.Request.URL.Path)
}()
})
router.GET("/long_sync", func(c *gin.Context) {
// 用 time.Sleep() 模拟一个长任务。
time.Sleep(5 * time.Second)
// 因为没有使用 goroutine,不需要拷贝上下文
log.Println("Done! in path " + c.Request.URL.Path)
})
// 监听并在 0.0.0.0:8080 上启动服务
router.Run(":8080")
}
相应数据
json相应
r.GET("/json",func(c *gin.Context){
c.JSON(http.StatusOK, gin.H{"message": "Hello, World!"})
})
结构体相应
// 2. 结构体响应
r.GET("/someStruct", func(c *gin.Context) {
var msg struct {
Name string
Message string
Number int
}
msg.Name = "root"
msg.Message = "message"
msg.Number = 123
c.JSON(200, msg)
})
XML相应
// 3.XML
r.GET("/someXML", func(c *gin.Context) {
c.XML(200, gin.H{"message": "abc"})
})
YMAL 相应
// 4.YAML响应
r.GET("/someYAML", func(c *gin.Context) {
c.YAML(200, gin.H{"name": "zhangsan"})
})
小结
其实 我的文档一定不是最好的 肯定有更加nb的大神 的理解 比我好
我只是快速入门 分享一下 我学习的笔记 嗯 就是如此
gin就是一个框架 简单的 干净的 (起码对于我来说比goframe轻 快 但是组件不全 很难受qwq)