当前位置:网站首页>Gin parameter validation
Gin parameter validation
2022-07-29 07:17:00 【Mar, LiuNian】
List of articles
Preface
gin The parameter validation of is integrated https://github.com/go-playground
Parameter validation
Use gin.Context in ShouldBind(obj) Method
obj adopt tag Set validation rules
Receive parameter field settings
//json:“json_name” representative json Format charge json_name Parameter value to Name
//form:"form_name" Receive on behalf of the form format form_name Parameter value to Name
//xml:"xml_name" representative xml Format charge xml_name Parameter to Name
type Register struct {
Name string `json:"json_name" form:"form_name" xml:"xml_name"`
}
Parameter condition limits
more tag Please check the official documents (https://pkg.go.dev/github.com/go-playground/validator/v10#hdr-Using_Validator_Tags)
//binding: The latter is conditional
//required: Required
//min: Minimum length
//max: Maximum length
type Register struct {
Name string `json:"json_name" form:"form_name" xml:"xml_name" binding:"required,min=3,max=10"`
}
Output error message
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type Register struct {
Name string `json:"json_name" form:"form_name" xml:"xml_name" binding:"required,min=3,max=10"`
}
func main() {
r := gin.Default()
r.POST("/register", func(c *gin.Context) {
r := &Register{
}
err := c.ShouldBind(r)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"message": "ok",
})
})
r.Run(":8080")
}
Verify Chinese processing of information
The verification error message without Chinese processing is like this :Key: ‘Register.Name’ Error:Field validation for ‘Name’ failed on the ‘required’ tag
First register the translator , Then create a universal translator , Get the specified translator from the general translator ( Sealed ), Then bind it to gin On the verifier of .
The error returned by the verifier is converted into go-playground Of ValidationErrors type , call Translate Specify a translator to translate
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/locales/en"
"github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
en_translation "github.com/go-playground/validator/v10/translations/en"
zh_translation "github.com/go-playground/validator/v10/translations/zh"
"net/http"
)
type Register struct {
Name string `json:"json_name" form:"form_name" xml:"xml_name" binding:"required,min=3,max=10"`
}
var trans ut.Translator
func initTranslator(language string) error {
// convert to go-playground Of validator
validate, ok := binding.Validator.Engine().(*validator.Validate)
if ok {
// Create translator
zhT := zh.New()
enT := en.New()
// Create a universal translator
// The first parameter is the alternate language , The latter is the language that should be supported
uni := ut.New(enT, enT, zhT)
// Get the specified language translator from
trans, ok = uni.GetTranslator(language)
if !ok {
return fmt.Errorf("not found translator %s", language)
}
// Bound to the gin On the verifier of , Yes binding Of tag Translate
switch language {
case "zh":
err := zh_translation.RegisterDefaultTranslations(validate, trans)
if err != nil {
return err
}
default:
err := en_translation.RegisterDefaultTranslations(validate, trans)
if err != nil {
return err
}
}
}
return nil
}
func main() {
err := initTranslator("zh")
if err != nil {
panic(err)
}
r := gin.Default()
r.POST("/register", func(c *gin.Context) {
r := &Register{
}
err := c.ShouldBind(r)
if err != nil {
if errors, ok := err.(validator.ValidationErrors); ok {
// Call the specified translator to translate
c.JSON(http.StatusBadRequest, gin.H{
"error": errors.Translate(trans),
})
} else {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
}
return
}
c.JSON(http.StatusOK, gin.H{
"message": "ok",
})
})
r.Run(":8080")
}
The returned error format processing
The error format returned above is like this
{
"error": {
"Register.Name": "Name Is a required field "
}
}
First of all, I passed JSON Format requested ,error Medium key Should be json_name,value
Should be json_name Is a required field
Ideal data structure
{
"error": {
"json_name": "json_name Is a required field "
}
}
json_name Can pass RegisterTagNameFunc Set the return field json_name, But even if you set json_name, however key still Register.json_name.
Solution : Handle the error results , To eliminate Register part
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/locales/en"
"github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
en_translation "github.com/go-playground/validator/v10/translations/en"
zh_translation "github.com/go-playground/validator/v10/translations/zh"
"net/http"
"reflect"
"strings"
)
type Register struct {
Name string `json:"json_name" form:"form_name" xml:"xml_name" binding:"required,min=3,max=10"`
}
var trans ut.Translator
func initTranslator(language string) error {
// convert to go-playground Of validator
validate, ok := binding.Validator.Engine().(*validator.Validate)
validate.RegisterTagNameFunc(func(field reflect.StructField) string {
// json:"json_name" form:"form_name" xml:"xml_name" binding:"required,min=3,max=10"
// Set back json tag The content in Such as :json_names
return field.Tag.Get("json")
})
if ok {
// Create translator
zhT := zh.New()
enT := en.New()
// Create a universal translator
// The first parameter is the alternate language , The latter is the language that should be supported
uni := ut.New(enT, enT, zhT)
// Get the specified language translator from
trans, ok = uni.GetTranslator(language)
if !ok {
return fmt.Errorf("not found translator %s", language)
}
// Yes binding Of tag Translate
switch language {
case "zh":
err := zh_translation.RegisterDefaultTranslations(validate, trans)
if err != nil {
return err
}
default:
err := en_translation.RegisterDefaultTranslations(validate, trans)
if err != nil {
return err
}
}
}
return nil
}
func remove(errors map[string]string) map[string]string {
result := map[string]string{
}
for key, value := range errors {
result[key[strings.Index(key, ".")+1:]] = value
}
return result
}
func main() {
err := initTranslator("zh")
if err != nil {
panic(err)
}
r := gin.Default()
r.POST("/register", func(c *gin.Context) {
r := &Register{
}
err := c.ShouldBind(r)
if err != nil {
if errors, ok := err.(validator.ValidationErrors); ok {
// Call the specified translator to translate
c.JSON(http.StatusBadRequest, gin.H{
// Call the custom function to remove Register part
"error": remove(errors.Translate(trans)),
})
} else {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
}
return
}
c.JSON(http.StatusOK, gin.H{
"message": "ok",
})
})
r.Run(":8080")
}
边栏推荐
- Hj37 statistics of the total number of rabbits per month Fibonacci series
- 1172. The plate stack has a sequence table + stack
- 2022-07-28:以下go语言代码输出什么?A:AA;B:AB;C:BA;D:BB。 package main import ( “fmt“ ) func main() { f
- Flink实时仓库-DWD层(下单-多张表实现join操作)模板代码
- 时钟树综合(一)
- MVFuseNet:Improving End-to-End Object Detection and Motion Forecasting through Multi-View Fusion of
- gin 模版
- Kubernetes (V) -- deploy kubernetes dashboard
- 实现改变一段文字的部分颜色效果
- 接口测试实战项目03:执行测试用例
猜你喜欢

Nodejs installation tutorial

Thoroughly understand kubernetes scheduling framework and plug-ins

Vite3.0都发布了,你还能卷得动吗(新特性一览)

JS chicken laying eggs and egg laying chickens. Who appeared earlier, object or function? Is function an instance of function?

Spark Learning Notes (VII) -- spark core core programming - RDD serialization / dependency / persistence / partition / accumulator / broadcast variables

外包干了3年,跳槽后转自动化测试工资是原来的2倍,秘诀原来是......

作业7.28 文件IO与标准IO

MySQL advanced (Advanced) SQL statement (I)

基于C语言设计的学生成绩排名系统

数组的子集能否累加出K
随机推荐
Interface test actual project 03: execute test cases
【C语言刷LeetCode】67. 二进制求和(E)
CAN&CANFD综合测试分析软件LKMaster与PCAN-Explorer 6分析软件的优势对比
vagrant box 集群 处理
城市花样精~侬好!DESIGN#可视化电台即将开播
win11系统错误:由于找不到 iertutil.dll,无法继续执行代码。重新安装程序可能会解决此问题
Flink实时仓库-DWD层(kafka-关联mysql的lookup join)模板代码
WPF 界面布局必知基础
JS chicken laying eggs and egg laying chickens. Who appeared earlier, object or function? Is function an instance of function?
彻底搞懂kubernetes调度框架与插件
Decompilation of wechat applet
要不要满足客户所有的需求
It's enough for MySQL to have this article (disgusting and crazy typing 37k words, just for Bo Jun's praise!!!)
Revolution of game assets
When NPM is installed, it is stuck. There are five solutions
Vite3.0都发布了,你还能卷得动吗(新特性一览)
约瑟夫环问题
Spark Learning Notes (VII) -- spark core core programming - RDD serialization / dependency / persistence / partition / accumulator / broadcast variables
Connecting PHP 7.4 to Oracle configuration on Windows
Improved pillar with fine grained feature for 3D object detection paper notes