Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,已经发布了1.0版本。具有快速灵活,容错方便等特点。其实对于golang而言,web框架的依赖要远比Python,Java之类的要小。
但是今天却发现 在 struct 加上该注释并没有用,于是翻墙找遍文档终于找到了答案
必须使用 dive 标记,它告诉 required 校验 深入到 slice、array 这样的子结构体里。
package main
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
)
type user struct {
Name string `json:"name" binding:"required"`
Email string `json:"email" binding:"required,email"`
}
type data struct {
User []user `json:"user" binding:"required,dive"` // use dive tag
}
//GetDataTest will get test data
func GetDataTest(c *gin.Context) {
var data data
err := c.Bind(&data)
if err == nil {
fmt.Printf("%+v", data)
c.JSON(http.StatusOK, gin.H{
"message": "done",
})
} else {
c.JSON(http.StatusBadRequest, gin.H{
"message": err.Error(),
})
}
}
func main(){
route := gin.Default()
route.POST("/", GetDataTest)
route.Run(":8080")
}
访问测试:
$ curl -H "Content-Type: application/json" -X POST --data '{"user": [{"email": "[email protected]","name": "alu"},{"email": "","name": "alu"}]}' http://localhost:8080/
结果:
{"message":"Key: 'data.User[1].Email' Error:Field validation for 'Email' failed on the 'required' tag"}