一、请求参数解析
1. 查询参数
fmt.Println(c.Query("user"))
fmt.Println(c.GetQuery("user"))
fmt.Println(c.QueryArray("user"))通过Query、GetQuery和QueryArray方法,可以方便地获取查询参数的值。
2. 动态参数
func _param(c *gin.Context) {
fmt.Println(c.Param("user_id"))
}3. 表单参数
func _form(c *gin.Context) {
fmt.Println(c.PostForm("name"))
fmt.Println(c.PostFormArray("name"))
fmt.Println(c.DefaultPostForm("addr", "四川省"))
forms, err := c.MultipartForm()
fmt.Println(forms, err)
}4. 原始请求体
body, _ := c.GetRawData()
contentType := c.GetHeader("content_Type")
switch contentType {
case "application/json":
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
var user User
err := json.Unmarshal(body, &user)
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(user)
}通过GetRawData方法,可以获取原始请求体的内容,并根据Content-Type进行相应的处理。
二、RESTful风格路由
RESTful风格是一种网络应用的架构风格,通过不同的HTTP方法来操作资源。
router.GET("/articles", _getList) // 获取文章列表
router.GET("/articles/:id", _getDetail) // 获取文章详情
router.POST("/articles", _create) // 创建文章
router.PUT("/articles/:id", _update) // 更新文章
router.DELETE("/articles/:id", _delete) // 删除文章通过这种方式,可以实现对资源的增删改查操作。
三、请求头与响应头
1. 请求头
fmt.Println(c.GetHeader("User-Agent"))
fmt.Println(c.Request.Header.Get("User-Agent"))
fmt.Println(c.Request.Header["User-Agent"])
fmt.Println(c.Request.Header.Get("Token"))
fmt.Println(c.Request.Header.Get("token"))2. 响应头
router.GET("/res", func(c *gin.Context) {
c.Header("Token", "abc")
c.JSON(0, gin.H{"data": "看看响应头"})
})通过Header方法,可以设置响应头中的信息。
三、绑定器与验证器
1. 绑定器
Gin提供了强大的绑定器功能,可以将前端传递的数据自动绑定到结构体中,并进行参数校验。
JSON绑定
type UserInfo struct {
Name string `json:"name"`
Age int `json:"age"`
Sex int `json:"sex"`
}
router.POST("/", func(c *gin.Context) {
var userInfo UserInfo
err := c.ShouldBindJSON(&userInfo)
if err != nil {
c.JSON(200, gin.H{"msg": "you are error"})
return
}
c.JSON(200, userInfo)
})通过ShouldBindJSON方法,可以将JSON格式的请求体绑定到结构体中。
type UserInfo struct {
Name string `json:"name" form:"name"`
Age int `json:"age" form:"age"`
Sex string `json:"sex" form:"sex"`
}
router.POST("/query", func(c *gin.Context) {
var userInfo UserInfo
err := c.ShouldBindQuery(&userInfo)
if err != nil {
fmt.Println(err)
c.JSON(200, gin.H{"msg": "you are error"})
return
}
c.JSON(200, userInfo)
})通过ShouldBindQuery方法,可以将查询参数绑定到结构体中。
2 数据验证
type SignUserInfo struct {
Name string `json:"name" binding:"required"`
Age int `json:"age"`
Password string `json:"password"`
RePassword string `json:"rePassword"`
}
func main() {
router := gin.Default()
router.POST("/", func(c *gin.Context) {
var user SignUserInfo
err := c.ShouldBindJSON(&user)
if err != nil {
c.JSON(200, gin.H{"msg": err.Error()})
return
}
c.JSON(200, gin.H{"data": user})
})
router.Run("localhost:8080")
}借助结构体标签中的 binding 标签,可以对数据进行验证,如 “required” 表示字段必填