likes
comments
collection
share

【Gin实战一】带你领略Gin框架的基本使用(安装、路由分组、参数占位符、获取参数、JSON传递)

作者站长头像
站长
· 阅读数 41

1.gin初体验

1.1安装

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

1.2极简web体验

package main

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

func main() {
    //1.创建一个Gin引擎实例
	r := gin.Default()
    //2.使用了Gin框架的路由功能,当用户访问/ping路径时,会返回一个JSON格式的响应
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080
}

1)创建一个HTTP GET路由,路径为 /ping

2)当用户访问该路径时,执行一个匿名函数,该函数的参数是一个 *gin.Context类型的上下文对象,用于处理请求和生成响应。

3)在该函数中,使用c.JSON() 方法返回一个JSON格式的响应,其中200表示HTTP响应状态码,gin.H表示一个Gin框架的键值对结构体(map),包含了一个message键和一个pong值。

点击运行,在浏览器中输入localhost:8080/ping,会返回:

{
  "message": "pong"
}

gin.Default()是Gin框架的一个函数,用于创建一个默认的Gin引擎实例,即包含Gin框架的默认中间件和配置。

我们同样还可以使用gin.New()创建Gin引擎实例。

gin.Default() 函数内部调用了gin.New() 函数创建一个Gin引擎实例,然后使用了两个默认的中间件Logger()Recovery()

Logger() 中间件用于记录请求的日志,包括请求方法、URL、状态码、耗时等信息,方便开发者进行调试和排查问题。Recovery() 中间件用于恢复程序的panic错误,防止程序崩溃。

gin.Default() 函数返回一个包含了默认中间件的Gin引擎实例,使得开发者可以快速地创建一个包含常用中间件和配置的Gin应用。开发者可以在此基础上进行进一步的定制和配置。相比之下,gin.New() 函数只创建了一个空白的Gin引擎实例,没有包含任何中间件和配置。

2.HTTP六个基本请求方法

func main() {
	// 使用默认中间件创建一个gin路由器
	// logger and recovery (crash-free) 中间件
	router := gin.Default()

	router.GET("/someGet", getting)
	router.POST("/somePost", posting)
	router.PUT("/somePut", putting)
	router.DELETE("/someDelete", deleting)
	router.PATCH("/somePatch", patching)
	router.HEAD("/someHead", head)
	router.OPTIONS("/someOptions", options)

	// 默认启动的是 8080端口,也可以自己定义启动端口
	router.Run()
	// router.Run(":3000") for a hard coded port
}

3.URL路由分组

Gin路由分组是一种将路由按照一定规则分组的方式,可以将一些具有相同特性的路由进行分类管理。在实际开发中,Gin路由分组有以下几种用途:

  1. 统一管理路由:当应用中存在大量的路由时,可以使用路由分组的方式对路由进行统一管理和配置,方便开发和维护。
  2. 增加路由可读性:将路由按照一定的规则进行分组,可以提高代码的可读性和可维护性,使得开发者可以更加清晰地了解应用中的路由结构。
  3. 添加中间件和配置:可以为每个路由组添加独立的中间件和配置,以实现不同的业务需求和功能。例如,可以为某个路由组添加认证中间件、日志中间件等,以实现对该路由组的特定功能的控制。
package main

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

func main() {
	router := gin.Default()

	// 定义v1版本路由分组
	v1 := router.Group("/v1")
	{
		v1.GET("/users", getUsersV1)
		v1.POST("/users", postUserV1)
	}

	// 定义v2版本路由分组
	v2 := router.Group("/v2")
	{
		v2.GET("/users", getUsersV2)
		v2.POST("/users", postUserV2)
	}

	router.Run(":8080")
}

func getUsersV1(c *gin.Context) {
	c.JSON(200, gin.H{
		"message": "get users from v1",
	})
}

func postUserV1(c *gin.Context) {
	c.JSON(200, gin.H{
		"message": "post user to v1",
	})
}

func getUsersV2(c *gin.Context) {
	c.JSON(200, gin.H{
		"message": "get users from v2",
	})
}

func postUserV2(c *gin.Context) {
	c.JSON(200, gin.H{
		"message": "post user to v2",
	})
}

这段代码演示了如何使用Gin路由分组来定义多个API版本。其中,我们定义了两个路由分组: /v1/v2,分别对应不同的API版本。

在每个路由分组中,我们定义了相应的GET和POST路由,用于查询和添加用户信息。对于不同版本的路由分组,我们可以根据需要定义不同的路由和处理函数,以实现不同的功能需求。

4.路由参数占位符

在Gin框架中, :name:id都是路由参数的占位符,用于捕获URL中的变量值。这样,在浏览器请求时,Gin框架可以自动解析URL中的参数,并将其传递给相应的处理函数,方便开发者在处理函数中进行后续的处理和逻辑判断。

例如,在下面的代码中,我们使用了 :name:id作为路由参数的占位符,当用户请求 /users/john/123时,Gin框架会自动解析出参数值name=johnid=123,并将其传递给getUser处理函数,方便开发者进行进一步的处理。

package main

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

func main() {
    router := gin.Default()

    // 定义路由
    router.GET("/users/:name/:id", getUser)

    router.Run(":8080")
}

// 处理函数:获取用户信息
func getUser(c *gin.Context) {
    name := c.Param("name")
    id := c.Param("id")

    c.JSON(200, gin.H{
        "message": "Get user " + name + ", id=" + id,
    })
}

5.获取参数

5.1get方法获取参数

在Gin框架中,我们可以使用c.Query()c.DefaultQuery()方法获取GET请求中的参数。

其中,c.Query()方法用于获取指定参数的值,如果参数不存在,则返回空字符串。例如,我们可以通过以下代码获取名为name的参数的值:

name := c.Query("name")

如果请求中不包含name参数,则返回空字符串。

c.DefaultQuery()方法则用于获取指定参数的值,并指定默认值。例如,我们可以通过以下代码获取名为page的参数的值,如果参数不存在,则返回默认值1

page := c.DefaultQuery("page", "1")

这样,无论请求中是否包含page参数,我们都可以获取到一个有效的值。

package main

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

func main() {
	router := gin.Default()

	// 定义路由
	router.GET("/users", getUsers)

	router.Run(":8080")
}

// 处理函数:获取用户信息
func getUsers(c *gin.Context) {
	// 获取name和page参数的值,如果不存在则使用默认值
	name := c.Query("name")
	page := c.DefaultQuery("page", "1")

	// 根据参数信息查询用户信息
	// ...

	// 返回查询结果
	c.JSON(200, gin.H{
		"name": name,
		"page": page,
		"users": []string{"john", "tom", "mary"},
	})
}

5.2post方法获取参数

在Gin框架中,我们可以使用c.PostForm()c.DefaultPostForm()方法获取POST请求中的参数。

其中,c.PostForm()方法用于获取指定参数的值,如果参数不存在,则返回空字符串。例如,我们可以通过以下代码获取名为name的参数的值:

name := c.PostForm("name")

如果请求中不包含name参数,则返回空字符串。

c.DefaultPostForm()方法则用于获取指定参数的值,并指定默认值。例如,我们可以通过以下代码获取名为page的参数的值,如果参数不存在,则返回默认值1

page := c.DefaultPostForm("page", "1")

这样,无论请求中是否包含page参数,我们都可以获取到一个有效的值。

除此之外,还可以使用c.PostFormArray()c.PostFormMap()方法获取参数值的切片或映射,以满足不同的业务需求。

以下是一个使用Gin框架处理POST请求参数的例子:

package main

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

func main() {
	router := gin.Default()

	// 定义路由
	router.POST("/users", postUser)

	router.Run(":8080")
}

// 处理函数:添加用户信息
func postUser(c *gin.Context) {
	// 获取name和age参数的值,如果不存在则使用默认值
	name := c.PostForm("name")
	age := c.DefaultPostForm("age", "18")

	// 添加用户信息到数据库
	// ...

	// 返回添加结果
	c.JSON(200, gin.H{
		"message": "add user " + name + " age " + age + " success",
	})
}

在该例子中,我们定义了一个POST路由/users,并在处理函数中获取了请求参数nameage的值。通过c.PostForm()c.DefaultPostForm()方法,我们可以方便地获取参数的值,并在添加用户信息时使用这些参数。

最后,我们将添加结果以JSON格式返回给客户端。如果请求中不包含name参数,则返回空字符串;如果请求中不包含age参数,则使用默认值18

6.JSON作为请求的出入参

在Gin框架中,我们可以使用c.BindJSON()方法将请求BODY中的JSON数据绑定到指定结构体中,并使用c.JSON()方法将处理结果以JSON格式返回给客户端。以下是一个使用Gin框架处理POST请求的例子,其中请求的出入参全部为JSON格式:

package main

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

type User struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

type AddUserReq struct {
	User User `json:"user"`
}

type AddUserResp struct {
	Result string `json:"result"`
}

func main() {
	router := gin.Default()

	// 定义路由
	router.POST("/users", addUser)

	router.Run(":8080")
}

// 处理函数:添加用户信息
func addUser(c *gin.Context) {
	// 解析请求BODY中的JSON数据
	var req AddUserReq
	if err := c.BindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 添加用户信息到数据库
	// ...

	// 返回添加结果
	resp := AddUserResp{
		Result: "add user " + req.User.Name + " age " + string(req.User.Age) + " success",
	}
	c.JSON(http.StatusOK, resp)
}

在该例子中,我们定义了一个名为User的结构体,用于存储用户信息;一个名为AddUserReq的结构体,用于存储添加用户请求的JSON数据;一个名为AddUserResp的结构体,用于存储添加用户响应的JSON数据。

在处理函数addUser()中,我们使用c.BindJSON()方法将请求BODY中的JSON数据绑定到AddUserReq结构体中,并执行相应的业务逻辑,然后将处理结果以AddUserResp结构体的形式返回给客户端。在返回响应时,我们使用c.JSON()方法将处理结果以JSON格式返回给客户端。

可以使用ApiFox或者PostMan进行测试,需要注意的是:

请求HEADER中的Content-Type属性为application/json,并将BODY中的数据设置为JSON格式,JSON输入为:

{"user": {"name": "john", "age": 18}}

点击发送即可进行测试。

7.总结

本文使用gin框架来提供web支持,共演示了http的六个基本请求方法、url路由分组、路由参数占位符、获取get/post参数的方式,传输JSON的方式,希望可以对你有所帮助。

转载自:https://juejin.cn/post/7231169018790690872
评论
请登录