【Gin实战一】带你领略Gin框架的基本使用(安装、路由分组、参数占位符、获取参数、JSON传递)
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路由分组有以下几种用途:
- 统一管理路由:当应用中存在大量的路由时,可以使用路由分组的方式对路由进行统一管理和配置,方便开发和维护。
- 增加路由可读性:将路由按照一定的规则进行分组,可以提高代码的可读性和可维护性,使得开发者可以更加清晰地了解应用中的路由结构。
- 添加中间件和配置:可以为每个路由组添加独立的中间件和配置,以实现不同的业务需求和功能。例如,可以为某个路由组添加认证中间件、日志中间件等,以实现对该路由组的特定功能的控制。
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=john和id=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
,并在处理函数中获取了请求参数name
和age
的值。通过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