在 Web 开发中,接收用户传递的参数是一项基本的任务。Gin 提供了多种方式来处理 HTTP 请求并解析参数,本文将介绍使用 Gin 框架接收参数的几种常见方法。
参数传递的方式不同,就意味着需要使用不同的参数接收方式,本文按照参数传递的方式对参数进行分类:
Query 参数URL 参数POST 表单(form-data)参数JSON 参数Header 参数接下来,将依次讲解这几种参数的接受方式。
Query 参数是最常见的 URL 传参方式,最常见通常也意味着最不安全,所以该传参方法常用于传递安全性要求较低的查询参数,所以可称之为 Query 参数。
Gin 允许通过 Query 方法来获取 URL 中的查询参数。下面是一个简单的例子:
在上篇文章介绍的 HelloController,go 中增加以下代码:
gofunc HelloQuery(c *gin.Context) {
    // 获取名为 "name" 的查询参数
    name := c.Query("name")
    
    // 为了便于观察接口调用情况,此处返回一些信息,本文不做讲解,将在下一篇文章详细介绍
    c.String(http.StatusOK, "Hello %s", name)
}
在 main.go 中增加以下代码:
goapi.GET("/helloQuery", controller.HelloQuery)
在上面的例子中,通过 c.Query("name") 方法获取名为 name 的查询参数,并返回一个包含参数值的字符串。
http://localhost:8080/gin/helloQuery?name=dingdangdog

除了查询参数,有时我们需要从 URL 节点中获取参数。Gin 允许通过定义路由参数来实现这一点。
PS:虽然它与
Query方式都是通过URL传参,但是本方式对于用户来说,更有隐蔽性。
示例:HelloController,go 增加:
gofunc HelloUrl(c *gin.Context) {
    // 获取名为 "name" 的路由参数
    name := c.Param("name")
    c.String(http.StatusOK, "Hello %s", name)
}
main.go 增加:
goapi.GET("/helloUrl/:name", controller.HelloUrl)
在上面的例子中,使用 :name 定义了一个路由参数,可以通过 c.Param("name") 方法获取该参数的值。
http://localhost:8080/gin/helloUrl/dingdangdog

在处理 POST 请求时,有时我们需要接收表单参数。Gin 允许使用 PostForm 方法来获取 POST 表单中的参数。
示例:HelloController,go 增加:
gofunc HelloPost(c *gin.Context) {
    // 获取名为 "name" 的表单参数
    name := c.PostForm("name")
    c.String(http.StatusOK, "Hello %s", name)
}
main.go 增加:
goapi.POST("/helloPost", controller.HelloPost)
http://localhost:8080/gin/helloPostname: dingdangdog
另一种常见的场景是接收 JSON 格式的参数,这种传参也需要 Post 方式传递。Gin 提供了 ShouldBindJSON 方法来解析 JSON 参数并绑定到结构体。
示例:HelloController,go 增加:
gotype User struct {
    Name string `json:"name"`
}
func HelloJson(c *gin.Context) {
    var user User
    if err := c.ShouldBindJSON(&user); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    c.String(http.StatusOK, "Hello %s", user.Name)
}
main.go 增加:
goapi.POST("/helloJson", controller.HelloJson)
在上面的例子中,定义了一个 User 结构体,通过 ShouldBindJSON 方法将 JSON 参数解析到该结构体中。
http://localhost:8080/gin/helloJson{"name": "dingdangdog"}
Http Header 虽然一般不会用于参数传递,但当然也可以用于参数传递(谁说Token不算参数!)。
示例:HelloController,go 增加:
gofunc HelloHeader(c *gin.Context) {
    name := c.GetHeader("name")
    c.String(http.StatusOK, "Hello %s", name)
}
main.go 增加:
goapi.GET("/helloHeader", controller.HelloHeader)
在上面的例子中,定义了一个 User 结构体,通过 ShouldBindJSON 方法将 JSON 参数解析到该结构体中。
http://localhost:8080/gin/helloHeadername: dingdangdog
main.go:
gopackage main
// 引用 fmt 和 gin
import (
    "fmt"
    "github.com/gin-gonic/gin"
    "gin-server/controller"
)
func main() {
    // 创建路由
    router := gin.Default()
        
    // 路由分组
    api := router.Group("/gin")
    // 开放接口
    api.GET("/hello", controller.Hello)
    api.GET("/helloQuery", controller.HelloQuery)
    api.GET("/helloUrl/:name", controller.HelloUrl)
    api.POST("/helloPost", controller.HelloPost)
    api.POST("/helloJson", controller.HelloJson)
    api.GET("/helloHeader", controller.HelloHeader)
    // 启动服务并设置端口为 8080
    err := router.Run(":8080")
    if err != nil {
        fmt.Println("Error: ", err)
    }
}
HelloController.go:
gopackage controller
import (
    "fmt"
    "github.com/gin-gonic/gin"
    "net/http"
)
// 接口参数必须是 c *gin.Context
func Hello(c *gin.Context) {
    fmt.Println("hello gin")
}
func HelloQuery(c *gin.Context) {
    // 获取名为 "name" 的查询参数
    name := c.Query("name")
    
    // 为了便于观察接口调用情况,此处返回一些信息,本文不做讲解,将在下一篇文章详细介绍
    c.String(http.StatusOK, "Hello %s", name)
}
func HelloUrl(c *gin.Context) {
    // 获取名为 "name" 的路由参数
    name := c.Param("name")
    c.String(http.StatusOK, "Hello %s", name)
}
func HelloPost(c *gin.Context) {
    // 获取名为 "name" 的表单参数
    name := c.PostForm("name")
    c.String(http.StatusOK, "Hello %s", name)
}
type User struct {
    Name string `json:"name"`
}
func HelloJson(c *gin.Context) {
    var user User
    if err := c.ShouldBindJSON(&user); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    c.String(http.StatusOK, "Hello %s", user.Name)
}
func HelloHeader(c *gin.Context) {
    name := c.GetHeader("name")
    c.String(http.StatusOK, "Hello %s", name)
}
以上是使用 Gin 框架接收参数的几种常见方法。根据不同的需求,选择合适的方法来处理参数可以使代码更加清晰和高效。
c.Query("name") 接收 Query 参数;c.Param("name") 接收 URL 参数;c.PostForm("name") 接收 Post-formdata 参数;c.ShouldBindJSON(&user) 接收 Post-Json 参数,建议定义结构体接收;c.GetHeader("name") 接收 Header 参数。http.StatusOK需要引入 net/http包Post 请求或自定义 Header 时,浏览器无法直接测试,可以使用测试工具,如:Postman等。通过以上学习,你已经学会了使用 Gin 接收 Http 请求时,获取请求参数的几乎所有用得到的操作,接下来将会讲解自定义响应相关的操作,敬请期待……
建站因为热爱,生活需要Money,请屏幕前的大佬动动您发财的小手,点击一次以示鼓励,祝您生活愉快!
PS:就目前的访问量,即便每个访客都点一次广告,收入也不足以支付运营成本。
如果看不到广告,可能是网络原因或被拦截了,那就算了吧。再次祝您生活愉快~~
本文作者:DingDangDog
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!