Go-web(三)Gin参数校验&cookie&session

本文详细介绍了如何在Go的Gin框架中进行参数校验,利用标签实现必填、范围等验证,并展示了自定义校验方法的实现。同时,文章还涵盖了Cookie的设置与读取,以及使用Gorilla Sessions库管理Session的基本操作,为Go-web开发提供实用技巧。
摘要由CSDN通过智能技术生成

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)
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值