学习思维导图
提高篇
请求参数
获取URL请求参数
func main() {
r := gin.Default()
//GET获取URL请求参数
r.GET("/Get", func(c *gin.Context) {
//查询请求URL后面的参数,如果没有填写默认值
DefaultQuery := c.DefaultQuery("Value1", "nil"))
//查询请求URL后面的参数
Query := c.Query("Value2")
c.String(http.StatusOK, "%s %s", DefaultQuery, Query)
})
//DELETE获取URL请求参数
r.DELETE("/DELETE", func(c *gin.Context) {
//查询请求URL后面的参数,如果没有填写默认值
DefaultQuery := c.DefaultQuery("Value3", "nil")
//查询请求URL后面的参数
Query := c.Query("Value4")
c.String(http.StatusOK, "%s %s", DefaultQuery, Query)
})
r.Run()
}
获取表单请求参数
func main() {
router := gin.Default()
//POST获取表单请求参数
r.POST("/POST", func(c *gin.Context) {
//从表单中查询参数,,如果没有就获取默认值
DefaultPostForm := c.DefaultPostForm("Value1", "nil")
//从表单中查询参数
PostForm := c.PostForm("Value2")
c.JSON(200, gin.H{
"status": "post",
"DefaultPostForm": DefaultPostForm,
"PostForm": PostForm,
})
})
//PUT获取表单请求参数
r.PUT("/PUT", func(c *gin.Context) {
//从表单中查询参数,,如果没有就获取默认值
DefaultPostForm := c.DefaultPostForm("Value3", "nil")
//从表单中查询参数
PostForm := c.PostForm("Value4")
c.JSON(200, gin.H{
"status": "post",
"DefaultPostForm": DefaultPostForm,
"PostForm": PostForm,
})
})
r.Run()
}
参数绑定Gin框架Bind
Json数据格式
package main
import (
"github.com/gin-gonic/gin"
"fmt"
)
type PostParams struct {
Name string `json:"name"`
Age int `json:"age"`
Sex bool `json:"sex"`
}
func main() {
r := gin.Default()
//ShouldBindJSON数据绑定
r.POST("/BindJSON", func(c *gin.Context) {
var p PostParams
//ShouldBindJSON参数绑定
err := c.ShouldBindJSON(&p)
if err != nil {
fmt.println(err.Error())
c.JSON(200, gin.H{
"msg": "bindjson报错了",
"data": gin.H{},
})
} else {
c.JSON(200, gin.H{
"msg": "bindjson请求成功",
"data": p, //如果请求成功则把p的值打印出来
})
}
})
r.Run()
}
From数据格式
package main
import (
"github.com/gin-gonic/gin"
"fmt"
)
type PostParams struct{
Name string `json:"name" form:"name"`
Age int `json:"age" form:"age"`
Sex bool `json:"sex" form:"sex"`
}
func main() {
r := gin.Default()
var p PostParams
r.GET("/BindFrom", func(c *gin.Context) {
//ShouldBind参数绑定
err := c.ShouldBind(&p)
if err != nil {
fmt.println(err.Error())
c.JSON(200, gin.H{
"msg": "bindfrom报错了",
"data": gin.H{},
})
} else {
c.JSON(200, gin.H{
"msg": "bindfrom请求成功",
"data": p, //如果请求成功则把u的值打印出来
})
}
})
r.Run()
}
Uri数据格式
package main
import (
"github.com/gin-gonic/gin"
"fmt"
)
type PostParams struct{
Name string `json:"name" uri:"name"`
Age int `json:"age" uri:"age"`
Sex bool `json:"sex" uri:"sex"`
}
func main(){
r := gin.Default()
//shouldbinduri数据绑定
r.POST("/testBind/:name/:age/:sex", func(c *gin.Context){
var p PostParams
err := c.ShouldBindUri(&p)
if err !=nil{
fmt.println(err.Error())
c.JSON(200, gin.H{
"msg": "binduri报错了",
"data": gin.H{},
})
}else{
c.JSON(200, gin.H{
"msg": "binduri请求成功",
"data": p, //如果请求成功则把p的值打印出来
})
}
})
r.Run()
}
参数校验
普通情况
满足格式接收,可以不用解析数据,减少if else,会简洁许多。
package main
import (
"fmt"
"time"
"github.com/gin-gonic/gin"
)
//Person ..
type Person struct {
//不能为空并且大于10
Age int `form:"age" binding:"required,gt=10"`
Name string `form:"name" binding:"required"`
Birthday time.Time `form:"birthday" time_format:"2006-01-02" time_utc:"1"`
}
func main() {
r := gin.Default()
r.GET("/test", func(c *gin.Context) {
var person Person
if err := c.ShouldBind(&person); err != nil {
c.String(500, fmt.Sprint(err))
return
}
c.String(200, fmt.Sprintf("%#v", person))
})
r.Run()
}
自定义情况
V8依赖包:gopkg.in/go-playground/validator.v8
V10依赖包:gopkg.in/go-playground/validator.v10
package main
import (
"net/http"
"reflect"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"gopkg.in/go-playground/validator.v8"
)
'''
对绑定解析到结构体上的参数,自定义验证功能
比如我们要对 name 字段做校验,要不能为空,并且不等于 admin ,类似这种需求,就无法 binding 现成的方法
需要我们自己验证方法才能实现 官网示例(https://godoc.org/gopkg.in/go-playground/validator.v8#hdr-Custom_Functions)
这里需要下载引入下 gopkg.in/go-playground/validator.v8
'''
type Person struct {
Age int `form:"age" binding:"required,gt=10"`
// 2、在参数 binding 上使用自定义的校验方法函数注册时候的名称
Name string `form:"name" binding:"NotNullAndAdmin"`
Address string `form:"address" binding:"required"`
}
// 1、自定义的校验方法
func nameNotNullAndAdmin(v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool {
if value, ok := field.Interface().(string); ok {
// 字段不能为空,并且不等于 admin
return value != "" && !("5lmh" == value)
}
return true
}
func main() {
r := gin.Default()
// 3、将我们自定义的校验方法注册到 validator中
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
// 这里的 key 和 fn 可以不一样最终在 struct 使用的是 key
v.RegisterValidation("NotNullAndAdmin", nameNotNullAndAdmin)
}
r.GET("/test", func(c *gin.Context) {
var person Person
if e := c.ShouldBind(&person); e == nil {
c.String(http.StatusOK, "%v", person)
} else {
c.String(http.StatusOK, "person bind err:%v", e.Error())
}
})
r.Run()
}
后记
喜欢的话可以三连,后续继续更新其他内容,帮忙推一推,感谢观看!