当前位置:网站首页>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")
}
边栏推荐
- 330. 按要求补齐数组
- Comparison of advantages between can & canfd integrated test analysis software lkmaster and PCA Explorer 6 analysis software
- Vscode remote debugging PHP solution through remotessh and Xdebug
- Homebrew brew update 长时间没反应(或卡在 Updating Homebrew...)
- Kubernetes (五) ---------部署 Kubernetes Dashboard
- Flink real-time warehouse DWD layer (transaction domain - additional purchase dimension degradation processing) template code
- Homebrew brew update doesn't respond for a long time (or stuck in updating homebrew...)
- WPF简单登录页面的完成案例
- 暑期总结(二)
- Pod基本介绍
猜你喜欢
Is online legend software testing training really so black hearted? Are they all scams?
SQL优化
WPF 界面布局必知基础
ETL为什么经常变成ELT甚至LET?
Summary of OCR optical character recognition methods
Error 1045 (28000) access denied for user 'root' @ 'localhost' solution
spark学习笔记(七)——sparkcore核心编程-RDD序列化/依赖关系/持久化/分区器/累加器/广播变量
Interface test actual project 03: execute test cases
JS 鸡生蛋与蛋生鸡问题,Object与Function究竟谁出现的更早?Function算不算Function的实例?
MVFuseNet:Improving End-to-End Object Detection and Motion Forecasting through Multi-View Fusion of
随机推荐
Google fragmented notes JWT (Draft)
使用VsCode配置MySQL实现连接、查询、等功能
约瑟夫环问题
【C语言刷LeetCode】2332. 坐上公交的最晚时间(M)
[Charles' daily problems] when you open Charles, you can't use nails
[C language brush leetcode] 1054. Bar code with equal distance (m)
论文阅读 (62):Pointer Networks
Vmware16 create virtual machine: cannot create a new virtual machine, do not have permission to perform this operation
对Vintage分析的一些学习理解
Win11vmware turns on the virtual machine and restarts on the blue screen and the solution that cannot be started
Win11 system error: code execution cannot continue because ierutil.dll cannot be found. Reinstalling the program may fix this problem
Homebrew brew update 长时间没反应(或卡在 Updating Homebrew...)
H3C_利用设置缺省静态路由优先级实现出口双线路的主备功能
MySQL 高级(进阶) SQL 语句 (一)
Cesium reflection
Error 1045 (28000) access denied for user 'root' @ 'localhost' solution
VMware16创建虚拟机:Win11无法安装
route的meta配置项
My personal website doesn't allow access to wechat, so I did this
同步/异步、阻塞/非阻塞 与 IO