跳至主要內容

Go gin 框架学习笔记

逸尘.Lycodx大约 3 分钟后端gogin

gin框架学习笔记

提示

说明:下面内容中的所有 ctx 均指 gin 框架中的上下文

一、安装

下载安装gin

go get -u github.com/gin-gonic/gin

注意

如果下载不了记得查看一下是否配置了代理:https://goproxy.cn/open in new window

二、第一个简单的例子

package main

import "github.com/gin-gonic/gin"

func main() {
	engine := gin.Default()
	engine.GET("/hello", func(ctx *gin.Context) {
		ctx.JSON(200, gin.H{
			"message": "hello word",
		})
	})
	engine.Run(":8000")
}

三、加载静态资源

3.1 加载favicon

import "github.com/thinkerou/favicon"

engine := gin.Default()
engine.Use(favicon.New("favicon.icon"))

3.2 加载html

engine :=  gin.Default()
// 全局加载html文件
engine.LoadHTMLGlob("static/*")
// 渲染页面
engine.GET("/index", func(ctx *gin.Context) {
    // 1.状态码  2.页面名称  3.数据
    ctx.HTML(http.StatusOK, "index.html", gin.H{"msg": "你好"})
})

获取后台传过来的msg

3.3 加载资源文件(css、js)

// 一个是相对目录 一个是跟目录;然后只需在对应的HTML中加载资源文件即可
engine.Static("/static", "./")

四、请求

4.1 获取请求参数

1) RESTful API 请求

// eg: /v1/user/:name
name := ctx.Param("name")

2) GET请求

// eg: /v1/user?name=zhangsan&age=18
name := ctx.Query("name")
age := ctx.Query("age")

3)POST请求

json数据

// 方法一
rec := make(map[string]interface{})  // 最好是结构体
err := ctx.ShouldBindJSON(&rec)

// 方法二
rec := make(map[string]interface{})  // 最好是结构体
datas, err := ctx.GetRawData()
json.Unmarshal(datas, &rec)

表单

name := ctx.PostForm("name")

五、验证

参考:https://www.liwenzhou.com/posts/Go/validator_usages/open in new window

六、路由

6.1 普通路由

engine := gin.Default()

engine.GET("/get", func1)
engine.POST("/post", func2)
engine.PUT("/put", func3)
engine.PATCH("/patch", func4)
engine.DELETE("/delete", func5)

6.2 空路由

engine.NoRoute(func(ctx *gin.Context) {
    ctx.HTML(http.StatusNotFound, "404.html", "")
})

6.3 路由组

group := engine.Group("/v1")
{
    group.GET("user", func1)
    group.POST("user", func2)
}

七、中间件

说明

当使用gin.Default()时默认已经绑定了2个中间件LoggerRecovery

gin的中间件使用非常简单通过Use方法进行设置

func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes

通过代码可以看出其实gin的中间件就是定义了一个HandlerFunc

// 通过一下两个方法来控制中间件
ctx.Next() // 放行
ctx.Abort() // 阻止

7.1 常用的中间件

1)压缩返回

eng.Use(gzip.Gzip(gzip.DefaultCompression))

2)http重定向https

func TlsHandler() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		secureMiddleware := secure.New(secure.Options{
			SSLRedirect: true,
            SSLHost:     "127.0.0.1:443", // https跳转地址,支持域名	
		})
		err := secureMiddleware.Process(ctx.Writer, ctx.Request)
		if err != nil {
			return
		}
		ctx.Next()
	}
}

3)代理静态资源

eng.Use(static.ServeRoot("/static", "./dist"))

八、返回

// 常用的json返回
ctx.JSON(http.StatusOK, gin.H{
    "message": "hello word",
})

// 适合返回byte类型的转化
ctx.Data(http.StatusOK, "application/json", nil)

// 返回html
ctx.HTML(http.StatusOK, "index.html", gin.H{"msg": "hello word"})

// 重定向
ctx.Redirect(301, "www.baidu.com")

九、context的使用

1、设置

ctx.Set("uid", 123)
ctx.Set("name", "admin")

2、读取

ctx.GetInt64("uid")
ctx.GetString("name")

十、开启服务并优雅的关闭服务

engine := gin.Default()
// 开启一个 goroutine启动服务
server := &http.Server{
    Addr:    "0.0.0.0:8080",
    Handler: engine,
}
go func() {
    err := server.ListenAndServe()
    if err != nil && err != http.ErrServerClosed {
        log.Fatal("server start err", err)
    }
}()
// 等待中断信号来优雅地关闭服务器,为关闭服务器操作设置一个5秒的超时
quit := make(chan os.Signal, 1) // 创建一个接收信号的通道
// kill 默认会发送 syscall.SIGTERM 信号
// kill -2 发送 syscall.SIGINT 信号,我们常用的Ctrl+C就是触发系统SIGINT信号
// kill -9 发送 syscall.SIGKILL 信号,但是不能被捕获,所以不需要添加它
// signal.Notify把收到的 syscall.SIGINT或syscall.SIGTERM 信号转发给quit
signal.Notify(quit, os.Interrupt)
<-quit // 阻塞在此,当接收到上述两种信号时才会往下执行
log.Println("Shutdown Server ...")
// 创建一个5秒超时的context
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// 5秒内优雅关闭服务(将未处理完的请求处理完再关闭服务),超过5秒就超时退出
if err := server.Shutdown(ctx); err != nil {
    log.Fatal("Server Shutdown:", err)
}

十一、相关资料

gin官方网站:https://gin-gonic.com/docs/quickstart/open in new window

其他参考资料:https://www.liwenzhou.com/posts/Go/gin/open in new window

上次编辑于: