网站Logo 90的blog

GIN框架2

root
5
2024-12-03

一、请求参数解析

1. 查询参数

fmt.Println(c.Query("user"))
fmt.Println(c.GetQuery("user"))
fmt.Println(c.QueryArray("user"))

通过QueryGetQueryQueryArray方法,可以方便地获取查询参数的值。

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” 表示字段必填

动物装饰