前回にてgin-gonic/ginで触りこぼしていたValidatorをちゃんと試してみました。
Validator
Model binding and validationに記載されているようにginではgo-playground/validatorを使っています。
Qiita: go-playground/validator リクエストパラメータ向けValidationパターンまとめで多くのパターンが整理されているので、こちらが参考になります。
QueryとBodyの両方で試しましたが、問題なくvalidateかけれていますね。
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
var usr User
if err := c.ShouldBindQuery(&usr); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, usr)
})
r.POST("/", func(c *gin.Context) {
var usr User
if err := c.ShouldBindJSON(&usr); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, usr)
})
r.Run(":8080")
}
type User struct {
Name string `form:"name"`
Age int `form:"age" binding:"required,max=10,min=5"`
}
# Test Query
$ curl 'localhost:8080?age=10&name=test'
{"Name":"test","Age":10}
$ curl 'localhost:8080?age=12&name=test'
{"error":"Key: 'User.Age' Error:Field validation for 'Age' failed on the 'max' tag"}
# Test Body
$ curl -X POST localhost:8080 -d '{"Age":8, "Name":"takeshi"}'
{"Name":"takeshi","Age":8}
$ curl -X POST localhost:8080 -d '{"Age":3, "Name":"takeshi"}'
{"error":"Key: 'User.Age' Error:Field validation for 'Age' failed on the 'min' tag"}
まとめ
ほとんどQiitaにまとまっていたため細かくはみていませんが、複雑なことをせずともValidateがかけられそうです。