Go Gin Validatorについて

Posted on
go gin

前回にて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がかけられそうです。