Gin框架学习 | 青训营

58 阅读3分钟

什么是Gin

Gin是一个使用Go语言开发的Web框架。

Gin的重要技术

  • 路由和参数传递: Gin 提供了灵活的路由定义方式,支持参数的传递。通过路径参数和查询参数,你可以轻松地获取 URL 中的数据。

  • 中间件的应用: Gin 的中间件允许你在请求到达处理器之前或之后执行逻辑。这可以用于身份验证、日志记录、错误处理等任务。

  • JSON 和绑定: Gin 内置了对 JSON 数据的解析和生成支持,使得处理 JSON 请求和响应变得非常方便。同时,你可以使用绑定功能将请求参数绑定到 Go 结构体中。

  • 静态文件服务: Gin 可以方便地提供静态文件服务,如图片、CSS、JavaScript 等。这在构建前端界面时非常有用。

安装

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

样例

package main

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

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

上述代码创建了一个默认的服务器,并且默认带有LoggerRecovery中间件。然后通过Http方法绑定路由规则和路由函数。不同于net/http库的路由函数,gin进行了封装,把request和response都封装到gin.Context的上下文环境。

除了GET方法,gin也支持POST、PUT、DELETE、OPTION等常用的restful方法。

0.0.0.0表示所有的IP地址。 如果监听的IP地址设置了 0.0.0.0 ,就表示这个服务器监听在本机的所有IP地址上,通过任何一个IP地址都可以访问到。

然后run方法开启监听。通过访问本机的8080端口即可获得响应。

{
    "message": "pong"
}

路由分组

	//v1路由组
	v1 := router.Group("/v1")
	{
		v1.GET("/login", loginEndpoint)
		v1.GET("/submit", submitEndpoint)
		v1.GET("/read", readEndpoint)
	}

	//v2组路由
	v2 := router.Group("/v2")
	{
		v2.GET("/login", loginEndpoint)
		v2.GET("/submit", submitEndpoint)
		v2.GET("/read", readEndpoint)
	}

获取API参数

api 参数通过Context的Param方法来获取。例如:

	router.GET("/user/:name", func(c *gin.Context) {
		name := c.Param("name")
		c.String(http.StatusOK, name)
	})

获取Query参数

Query 参数通过 DefaultQueryQuery 方法获取。

区别:

  • 使用 DefaultQuery 方法读取参数,其中当参数不存在的时候,可以设置默认值。

  • 使用 Query 方法读取正常参数,当参数不存在的时候,返回空字串。

获取form表单参数

通过DefaultPostFormPostForm方法获取。

同样DefaultPostForm方法可以指定默认值。

获取JSON参数

通过BindJSON方法绑定对应的结构体即可。

响应类型

字符串

	r.GET("/string", func(c *gin.Context) {
		c.String(http.StatusOK, "返回字符串")
	})

json

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

xml和yaml类似

html

例如有一个index.html模板。

然后通过r.LoadHTMLFiles("html/index.html")加载这个模板文件,这样我们才能使用它。

然后定义路由

	r.GET("/html", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", gin.H{"title": "Main website"})
	})

文件

在golang中,没有相对文件的路径,它只有相对项目的路径。

router.StaticFile("/photo.png", "static/photo.png"),其中第一个参数是网页请求的路由,第二个参数是文件的路径。

中间件

Gin的中间件,其实就是Gin定义的一个HandlerFunc,通过中间件,我们可以对一组 API 接口进行统一的操作,可以很方便的拦截请求,来做一些我们需要做的事情,比如日志记录、授权校验、各种过滤等等。

gin.Default()默认使用了Logger和Recovery中间件。

  • Logger中间件将日志写入gin.DefaultWriter。
  • Recovery中间件会recover任何panic。如果有panic的话,会写入500响应码。

参考

快速入门 | Gin Web Framework (gin-gonic.com)