Gin快速入门:四大请求方式及获取请求参数的方式 | 青训营

251 阅读3分钟

# Gin框架四大请求方式

GET POST PUT DELETE

其中最常见的为GET和POST请求

Restful风格指的是网络应用中就是资源定位和资源操作的风格。不是标准也不是协议。

GET:从服务器取出资源(一项或多项)

POST:在服务器新建一个资源 (注册服务)

PUT:在服务器更新资源(客户端提供完整资源数据)

PATCH:在服务器更新资源(客户端提供需要修改的资源数据)

DELETE:从服务器删除资源

注意:对代码的解释多为注释部分

Gin框架获取请求参数的各种方式

在Gin框架中,获取请求参数的方式有以下几种:

  1. GET请求参数
  2. POST请求参数-Form表单
  3. POST请求参数-JSON格式
  4. URL参数
  5. 请求头部参数

1. GET请求参数

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

    // 使用GET请求并获取参数
    router.GET("/user", func(c *gin.Context) {
        // 使用Query获取请求参数
        username := c.Query("username")
        password := c.Query("password")

        // 返回请求参数
        c.JSON(200, gin.H{
            "username": username,
            "password": password,
        })
    })

    // 运行服务
    router.Run(":8080")
}

2. POST请求参数-Form表单

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

    // 使用POST请求并获取参数
    router.POST("/user", func(c *gin.Context) {
        // 使用PostForm获取请求参数
        username := c.PostForm("username")
        password := c.PostForm("password")

        // 返回请求参数
        c.JSON(200, gin.H{
            "username": username,
            "password": password,
        })
    })

    // 运行服务
    router.Run(":8080")
}

3. POST请求参数-JSON格式

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

    // 使用POST请求并获取参数
    router.POST("/user", func(c *gin.Context) {
        // 将JSON格式请求参数绑定到结构体上
        var user User
        if err := c.BindJSON(&user); err != nil {
            // 返回错误信息
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }

        // 返回请求参数
        c.JSON(200, gin.H{
            "username": user.Username,
            "password": user.Password,
        })
    })

    // 运行服务
    router.Run(":8080")
}

type User struct {
    Username string `json:"username"`
    Password string `json:"password"`
}

4. URL参数

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

    // 使用URL参数并获取参数
    router.GET("/user/:username/:password", func(c *gin.Context) {
        // 使用Param获取URL参数
        username := c.Param("username")
        password := c.Param("password")

        // 返回请求参数
        c.JSON(200, gin.H{
            "username": username,
            "password": password,
        })
    })

    // 运行服务
    router.Run(":8080")
}

5. 请求头部参数

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

    // 使用请求头部参数并获取参数
    router.GET("/user", func(c *gin.Context) {
        // 使用Request获取请求头部参数
        username := c.Request.Header.Get("username")
        password := c.Request.Header.Get("password")

        // 返回请求参数
        c.JSON(200, gin.H{
            "username": username,
            "password": password,
        })
    })

    // 运行服务
    router.Run(":8080")
}

完成以上5种方式后,可以根据实际需要选用相应的方式来获取请求参数。

那有没有一种方式, 我只要需要提供结构体, 就能把各个部分的请求参数绑定上的方式呢?

是的,你可以使用Gin框架提供的ShouldBindShouldBindJSON方法,根据请求的Content-Type自动绑定URL、FORM、JSON等各种格式到指定结构体中,省去了重复的参数获取和类型转换,提高了代码的可读性。

以下是详细的代码示例:

// 定义需要绑定请求参数的结构体
type User struct {
    Username string `form:"username" json:"username" binding:"required"`
    Password string `form:"password" json:"password" binding:"required"`
}

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

    // 使用ShouldBind方法自动绑定请求参数到结构体,并进行校验
    router.POST("/user", func(c *gin.Context) {
        var user User
        if err := c.ShouldBind(&user); err != nil {      //根据req的content type 自动推断如何绑定,form/json/xml等格式
            c.JSON(400, gin.H{"error": err.Error()})
            return
        }
        c.JSON(200, gin.H{
            "username": user.Username,
            "password": user.Password,
        })
    })

    // 运行服务
    router.Run(":8080")
}

上述代码中,我们定义了一个结构体User,并使用formjson标签定义了请求参数的名称,同时也定义了参数绑定时需要满足的条件(这里为必填),然后在路由函数中使用ShouldBind方法自动将URL、FORM、JSON等各种格式的参数绑定到User结构体中,如果参数校验失败则会返回错误信息,否则返回绑定后的参数。 相比其他方式,这种方法在代码精简、可读性高等方面都有很大的优势,但前提是你需要提供一个合适的结构体来表示请求参数的结构和内容。

参考文章:编程社区