✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。
所属的专栏: Go语言开发零基础到高阶实战
景天的主页: 景天科技苑
文章目录
- Gin框架请求参数的获取
-
- 一、请求参数的类型和位置
- 二、获取请求参数的方法
-
- [1. 直接获取请求参数](#1. 直接获取请求参数)
-
- [(1)获取URL Path参数](#(1)获取URL Path参数)
- [(2)获取URL Query参数](#(2)获取URL Query参数)
- [(3)获取HTTP Body参数](#(3)获取HTTP Body参数)
- (4)获取Header参数
- [2. 绑定请求参数到结构体](#2. 绑定请求参数到结构体)
-
- [(1)绑定URL Query参数到结构体](#(1)绑定URL Query参数到结构体)
- [(2)绑定HTTP Body参数到结构体(JSON格式)](#(2)绑定HTTP Body参数到结构体(JSON格式))
Gin框架请求参数的获取
Gin是一个用Go语言编写的Web框架,它提供了强大的路由和中间件功能,使得开发Web应用变得更加简单和高效。
在使用Gin框架开发Web应用时,处理请求参数是一个非常重要的环节。本文将结合实际案例,详细介绍在Go语言中如何使用Gin框架处理请求参数。
一、请求参数的类型和位置
在HTTP请求中,参数可以通过多种方式传递,常见的类型包括:
URL Path参数:参数直接写在请求路径中,例如/user/:id。
URL Query参数:参数跟在URL的?后面,以键值对的形式传递,多个参数之间用&分隔,例如/user/list?name=John&gender=男。
HTTP Body参数:参数在请求体中传递,通常用于POST、PUT等请求方法,内容格式可以是JSON、XML等。
Header参数:参数在HTTP请求头中传递,例如Content-Type、Accept等。
二、获取请求参数的方法
Gin框架提供了多种方法来获取请求参数,包括直接获取和绑定到结构体中两种方式。
1. 直接获取请求参数
(1)获取URL Path参数
URL Path参数是指直接写在请求路径中的参数,可以通过Gin框架的Param方法获取。
后台获取路径请求参数通过ctx.Param("参数名") 来获取
示例代码:
go
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
engine := gin.Default()
//请求参数 用:变量名 表示
engine.GET("/user/:id", func(ctx *gin.Context) {
//后台获取请求参数通过ctx.Param("参数名") 来获取
id := ctx.Param("id")
//响应到页面
//fmt.Fprintf(ctx.Writer, "你的请求id: %s", id)
ctx.String(http.StatusOK, "您的id是%s", id)
})
engine.Run()
}
运行后,发起请求http://localhost:8080/user/100,会返回你的请求id: 100。
(2)获取URL Query参数
URL Query参数是指跟在URL的?后面的键值对集合,可以通过Gin框架的Query、DefaultQuery、QueryArray、QueryMap等方法获取。
示例代码:
go
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
engine := gin.Default()
engine.GET("/user/list", func(ctx *gin.Context) {
name := ctx.Query("name")
gender := ctx.DefaultQuery("gender", "男")
habits := ctx.QueryArray("habits")
fmt.Printf("name: %s, gender: %s, habits: %v\n", name, gender, habits)
works := ctx.QueryMap("works")
//响应到页面
ctx.String(http.StatusOK, "%s, %s, %v, %s\n", name, gender, habits, works)
})
engine.Run(":8080")
}
运行后,浏览器发起请求
会返回 John, 男, [reading sports], map[engineer:computer teacher:math]
(3)获取HTTP Body参数
HTTP Body参数是指请求体中的参数,通常用于POST、PUT等请求方法。可以通过Gin框架的PostForm、DefaultPostForm、PostFormArray、PostFormMap等方法获取。
示例代码:
go
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
engine := gin.Default()
//使用post请求
engine.POST("/user/add", func(ctx *gin.Context) {
name := ctx.PostForm("name")
gender := ctx.DefaultPostForm("gender", "男")
//获取切片数据
habits := ctx.PostFormArray("habits")
//获取map数据
works := ctx.PostFormMap("works")
fmt.Printf("%s, %s, %v, %s\n", name, gender, habits, works)
})
engine.Run()
}
postman发请求
(4)获取Header参数
Header参数是指HTTP请求头中的参数,可以通过Gin框架的GetHeader方法获取。
示例代码:
go
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
engine := gin.Default()
engine.POST("/getHeader", func(ctx *gin.Context) {
//拿到请求头参数数据
userAgent := ctx.GetHeader("User-Agent")
ctx.String(http.StatusOK, "User-Agent: %s", userAgent)
})
engine.Run()
}
2. 绑定请求参数到结构体
Gin框架支持将请求参数自动绑定到结构体中,这样可以更方便地进行参数验证和处理。绑定参数的方法包括Bind、ShouldBind、BindJSON、BindQuery等。
(1)绑定URL Query参数到结构体
示例代码:
go
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
// User 定义结构体,使用form标签指定参数名,以便正确地绑定参数 get请求使用功能form标签
type User struct {
Id int64 `form:"id"`
Name string `form:"name"`
Age int `form:"age"`
Email string `form:"email"`
}
func main() {
engine := gin.Default()
engine.GET("/user/info", func(ctx *gin.Context) {
var user User
//将结构体对象指针传进去
if err := ctx.ShouldBindQuery(&user); err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
//以json字符串的方式响应给客户端这个结构体对象
ctx.JSON(http.StatusOK, user)
})
engine.Run()
}
(2)绑定HTTP Body参数到结构体(JSON格式)
当前端请求的数据通过JSON提交时,例如向/json
发送一个POST请求
示例代码:
go
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
// User 绑定HTTP Body参数到结构体 ,创建结构体时需要用json标签
type User struct {
Id int64 `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
Email string `json:"email"`
}
func main() {
engine := gin.Default()
engine.POST("/user/add", func(ctx *gin.Context) {
var user User
// ctx.ShouldBindJSON(&user) 将结构体指针传进去
if err := ctx.ShouldBindJSON(&user); err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
//响应给客户端结构体
ctx.JSON(http.StatusOK, user)
})
engine.Run()
}
也可以直接获取原生json数据处理
go
package main
import (
"encoding/json"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
engine := gin.Default()
engine.POST("/json", func(ctx *gin.Context) {
// GetRawData : 从c.Request.Body读取请求数据, 返回 []byte
// func (c *Context) GetRawData() ([]byte, error)
b, _ := ctx.GetRawData()
// 定义map或结构体接收
var m map[string]interface{}
// 将接收的b json反序列化为map数据
_ = json.Unmarshal(b, &m)
ctx.JSON(http.StatusOK, m)
})
engine.Run()
}