binding data & validate
binding data
- 新增
Person
结构blog-entity.go
package entity type Person struct { FirstName string `json:"firstName"` LastName string `json:"lastName"` Age int `json:"age"` Email string `json:"email"` } type BlogEntity struct { Title string `json:"title"` Description string `json:"description"` URL string `json:"url"` Author Person `json:"author"` }
- 为每个数据都加上binding
blog-entity.go
package entity type Person struct { FirstName string `json:"firstName" binding:"required"` LastName string `json:"lastName" binding:"required"` Age int `json:"age" binding:"required,gte=1,lte=200"` Email string `json:"email" binding:"required,email"` } type BlogEntity struct { Title string `json:"title" binding:"required,min=2,max=20"` Description string `json:"description" binding:"required,max=200"` URL string `json:"url" binding:"required,url"` Author Person `json:"author" binding:"required"` }
- 修改
blog-controller.go
package controller import ( "learn-gin/entity" "learn-gin/service" "github.com/gin-gonic/gin" ) type BlogController interface { FindAll() []entity.BlogEntity Save(*gin.Context) error } type blogController struct { bs service.BlogService } func New(bs service.BlogService) BlogController { return &blogController{ bs: bs, } } func (bc *blogController) FindAll() []entity.BlogEntity { return bc.bs.FindAll() } func (bc *blogController) Save(c *gin.Context) error { var blog entity.BlogEntity if err := c.ShouldBindJSON(&blog); err != nil { return err } bc.bs.Save(blog) return nil }
- 修改
server.go
package main import ( "io" "learn-gin/controller" "learn-gin/middleware" "learn-gin/service" "net/http" "os" "github.com/gin-gonic/gin" ginDump "github.com/tpkeeper/gin-dump" ) var ( blogService service.BlogService = service.New() blogController controller.BlogController = controller.New(blogService) ) func setupLogOutput() { f, _ := os.Create("log/learn-gin.log") gin.DefaultWriter = io.MultiWriter(f, os.Stdout) } func main() { setupLogOutput() server := gin.New() server.Use(gin.Recovery(), middleware.Logger(), middleware.BasicAuth(), ginDump.Dump()) server.GET("blogs", func(c *gin.Context) { c.JSON(http.StatusOK, blogController.FindAll()) }) server.POST("blogs", func(c *gin.Context) { err := blogController.Save(c) if err != nil { c.JSON(http.StatusBadRequest, gin.H{ "error": err.Error(), }) } else { c.JSON(http.StatusCreated, gin.H{ "message": "blog Created!", }) } }) server.Run(":8080") //启动服务端口,端口参数可选 }
- 运行
go run server.go
- 测试
inputPOST - localhost:8080/blogs
output{ "title": "c", "description": "", "url": "xxxx", "author": { "firstName": "", "lastName": "", "age": 300, "email": "xxx" } }
input{ "error": "Key: 'BlogEntity.Title' Error:Field validation for 'Title' failed on the 'min' tag\nKey: 'BlogEntity.URL' Error:Field validation for 'URL' failed on the 'url' tag\nKey: 'BlogEntity.Author.FirstName' Error:Field validation for 'FirstName' failed on the 'required' tag\nKey: 'BlogEntity.Author.LastName' Error:Field validation for 'LastName' failed on the 'required' tag\nKey: 'BlogEntity.Author.Age' Error:Field validation for 'Age' failed on the 'lte' tag\nKey: 'BlogEntity.Author.Email' Error:Field validation for 'Email' failed on the 'email' tag"}
output{ "title": "title", "description": "description1", "url": "http://xxxx.com", "author": { "firstName": "xxx", "lastName": "xxxx", "age": 100, "email": "xxx@xxx.com" } }
{"message": "blog Created!"}
validate
- 新建文件夹
validator
- 新建文件
validator/blog-validator.go
使用package validator import ( "strings" "github.com/go-playground/validator/v10" ) func VideoTitleValidator(field validator.FieldLevel) bool { return strings.Contains(field.Field().String(), "blog") //检查title字段时候包含"blog"字眼 }
blog-entity.go
注册package entity type Person struct { FirstName string `json:"firstName" binding:"required"` LastName string `json:"lastName" binding:"required"` Age int `json:"age" binding:"required,gte=1,lte=200"` Email string `json:"email" binding:"required,email"` } type BlogEntity struct { Title string `json:"title" binding:"required,min=2,max=20" validate:"is-blog"` Description string `json:"description" binding:"max=200"` URL string `json:"url" binding:"required,url"` Author Person `json:"author" binding:"required"` }
blog-controller.go
package controller import ( "learn-gin/entity" "learn-gin/service" myValidator "learn-gin/validator" "github.com/gin-gonic/gin" "github.com/go-playground/validator/v10" ) type BlogController interface { FindAll() []entity.BlogEntity Save(*gin.Context) error } type blogController struct { bs service.BlogService } var validate *validator.Validate func New(bs service.BlogService) BlogController { validate = validator.New() validate.RegisterValidation("is-blog", myValidator.VideoTitleValidator) return &blogController{ bs: bs, } } func (bc blogController) FindAll() []entity.BlogEntity { return bc.bs.FindAll() } func (bc blogController) Save(c *gin.Context) error { var blog entity.BlogEntity if err := c.ShouldBindJSON(&blog); err != nil { return err } if err := validate.Struct(blog); err != nil { return err } bc.bs.Save(blog) return nil }
- 运行
go run server.go
- 测试
input
output{ "title": "title", "description": "description1", "url": "http://xxxx.com", "author": { "firstName": "xxx", "lastName": "xxxx", "age": 100, "email": "xxx@xxx.com" } }
input{"error": "Key: 'BlogEntity.Title' Error:Field validation for 'Title' failed on the 'is-blog' tag"}
output{ "title": "blog title", "description": "description1", "url": "http://xxxx.com", "author": { "firstName": "xxx", "lastName": "xxxx", "age": 100, "email": "xxx@xxx.com" } }
{"message": "blog Created!"}