Go-web(三)Gin参数校验&cookie&session
标签校验
gin中对于参数校验提供了非常方便的标签校验,即在定义接收结构体时即可通过添加标签进行校验
// 参数校验通过绑定tag实现
type ValiadStruct struct {
// required:非空校验
Name string `form:"name" json:"name" binding:"required"`
// min,max最大最小值校验
Age int `form:"age" json:"age" binding:"required,min=0,max=100"`
}
在进行接受绑定时,gin会进行校验,不符合则直接报错:
// gin参数校验
r.POST("/vaild", func(context *gin.Context) {
var valid ValiadStruct
if err := context.Bind(&valid);err != nil{
context.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
fmt.Println("name: ",valid.Name," age: ",valid.Age)
context.JSON(200,gin.H{
"vaild":valid,
})
})
自定义校验
go get gopkg.in/go-playground/validator.v8
- 自定义校验方法
- 注册校验方法,key就是在结构体中使用的标签
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)
}
/*
curl -X GET "http://127.0.0.1:8080/testing?name=&age=12&address=beijing"
curl -X GET "http://127.0.0.1:8080/testing?name=lmh&age=12&address=beijing"
curl -X GET "http://127.0.0.1:8080/testing?name=adz&age=12&address=beijing"
*/
r.GET("/5lmh", 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()
}
cookie
// 服务端接收客户端cookie,下发cookie
r.GET("/test_cookie", func(context *gin.Context) {
cookie,err := context.Cookie("cookie_key")
if err != nil{
cookie = "cookie_val"
// 给客户端设置cookie
// maxAge int, 单位为秒
// path,cookie所在目录
// domain string,域名
// secure 是否智能通过https访问
// httpOnly bool 是否允许别人通过js获取自己的cookie
context.SetCookie("cookie_key",cookie,60,"/","localhost",false,false)
}
context.JSON(200,cookie)
})
session
// github.com/gorilla/sessions,session管理神奇
var store = sessions.NewCookieStore([]byte("something-very-secret"))
func saveSession(w http.ResponseWriter,r *http.Request) {
// 获取一个session
session,err := store.Get(r,"session_name")
if err != nil{
return
}
// set session
session.Values["session_name"] = "session_val"
// set session life time
session.Options.MaxAge = 10
session.Save(r,w)
}