TeamClass_MD/Go入门速成/Day3/Gin的使用.md
2025-03-20 21:57:22 +08:00

5.1 KiB
Raw Blame History

Gin的使用

Gin是什么

  • Gin 是一个用 Go 语言编写的高性能 Web 框架,以其快速的路由和中间件支持著称。它基于 httprouter,提供了简洁的 API 和强大的功能,适合构建高效的 Web 应用和 API。

如何使用Gin

创建一个最基本的Gin程序

package main

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

func main() {
   // 创建默认 Gin 实例
   r := gin.Default()

   // 定义路由和处理函数
   r.GET("/", func(c *gin.Context) {
       c.JSON(200, gin.H{
           "message": "Hello, Gin!",
       })
   })
   // 启动服务器,默认监听 8080 端口
   r.Run()
}
  • 修改启动端口r.Run("80")

Gin的使用方式

  • Gin 支持多种 HTTP 方法的路由定义:
    • GET
    • POST
    • PUT
    • DELETE
    • PATCH
    • OPTIONS
    • HEAD
    r.GET("/get", func(c *gin.Context) {
    c.JSON(200, gin.H{
            "message": "GET request",
        })
    })
    
    r.POST("/post", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "POST request",
        })
    })
    
  • Gin获取请求参数
      • 查询参数c.Query("key")
    • 表单参数c.PostForm("key")
    • 路径参数c.Param("key")
    r.GET("/user", func(c *gin.Context) {
        name := c.Query("name")
        c.JSON(200, gin.H{
            "name": name,
        })
    })
    
    r.POST("/user", func(c *gin.Context) {
        name := c.PostForm("name")
        c.JSON(200, gin.H{
            "name": name,
        })
    })
    
    r.GET("/user/:id", func(c *gin.Context) {
        id := c.Param("id")
        c.JSON(200, gin.H{
            "id": id,
        })
    })
    
    • Json参数
    var orders struct {  
        DeviceId  string `json:"deviceId"`  
        Isrunning int    `json:"isrunning"`  
    }  
    if err := c.ShouldBind(&orders); err != nil {  
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})  
        return  
    }
    
  • 分组路由

使用 r.Group() 创建路由分组:

v1 := r.Group("/")
{
    v1.GET("/login", func(c *gin.Context) {
        c.String(200, "v1 login")
    })
    v1.GET("/submit", func(c *gin.Context) {
        c.String(200, "v1 submit")
    })
}
  • Gin使用中间件
func Logger() gin.HandlerFunc {
    return func(c *gin.Context) {
        fmt.Println("Request received")
        c.Next()
    }
}

func main() {
    r := gin.Default()
    r.Use(Logger())

    r.GET("/", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "Hello, Gin!",
        })
    })

    r.Run()
}
  • 返回多种响应
    • JSONc.JSON(code, obj)
    • 字符串c.String(code, format, values...)
    • HTMLc.HTML(code, name, obj)
    • 文件c.File(filepath)
r.GET("/json", func(c *gin.Context) {
    c.JSON(200, gin.H{
        "message": "JSON response",
    })
})

r.GET("/string", func(c *gin.Context) {
    c.String(200, "String response")
})

r.GET("/html", func(c *gin.Context) {
    c.HTML(200, "index.html", gin.H{
        "title": "Main website",
    })
})
r.GET("/getfiles", getfiles)
func getfiles(c *gin.Context) {
	c.File("./Halloworld.txt")
}

常用的中间件

1. CORS 跨域中间件

作用:处理跨域请求,允许前端应用访问 API。 • 包地址github.com/gin-contrib/cors安装

go get github.com/gin-contrib/cors

示例

import "github.com/gin-contrib/cors"

r.Use(cors.New(cors.Config{
  AllowOrigins:  []string{"https://example.com"},
  AllowMethods:  []string{"GET", "POST"},
  AllowHeaders:  []string{"Authorization"},
}))

2. JWT 身份验证中间件

作用:验证请求的 Token保护需要登录的接口。 • 包地址github.com/appleboy/gin-jwt/v2安装

go get github.com/appleboy/gin-jwt/v2

示例

authMiddleware, _ := jwt.New(&jwt.GinJWTMiddleware{
  Realm:       "my-app",
  Key:         []byte("secret-key"),
  Timeout:     time.Hour,
})
r.POST("/login", authMiddleware.LoginHandler)
r.GET("/protected", authMiddleware.MiddlewareFunc(), func(c *gin.Context) {
  c.JSON(200, gin.H{"msg": "Authorized"})
})

3. 限流中间件Rate Limiter

作用:防止接口被频繁调用(如防止暴力破解)。 • 包地址github.com/ulule/limiter/v3 + github.com/ulule/limiter/v3/drivers/middleware/gin安装

go get github.com/ulule/limiter/v3

示例

import (
  "github.com/ulule/limiter/v3"
  "github.com/ulule/limiter/v3/drivers/middleware/gin"
  "github.com/ulule/limiter/v3/drivers/store/memory"
)

rate := limiter.Rate{
  Period: 1 * time.Minute,
  Limit:  100, // 每分钟最多 100 次请求
}
store := memory.NewStore()
limiterMiddleware := gin.NewMiddleware(limiter.New(store, rate))
r.Use(limiterMiddleware)

4. GZIP 压缩中间件

作用:压缩 HTTP 响应体,减少传输体积。 • 包地址github.com/gin-contrib/gzip安装

go get github.com/gin-contrib/gzip

示例

import "github.com/gin-contrib/gzip"

r.Use(gzip.Gzip(gzip.DefaultCompression))