V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
fhy1994
V2EX  ›  Go 编程语言

用过 go-playground/validator 的老哥麻烦进来下

  •  
  •   fhy1994 ·
    fanhengyuan · 2019-08-29 18:04:10 +08:00 · 3917 次点击
    这是一个创建于 1700 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在研究 gin 框架 用到参数验证器 发现真的难用

    我在验证传参的时候 只能验证大写的变量

    请问:怎样才能验证以小写字母开头的变量

    传小写变量:

    2019/08/29 17:45:48 [P 为必填字段 N 为必填字段]
    [GIN] 2019/08/29 - 17:45:48 | 200 |    1.995798ms |    192.168.5.21 | GET      /v1/api/test/test_users?p=1&n=15
    

    获取不到传入的待验证参数:

    2019/08/29 17:45:48 [P 为必填字段 N 为必填字段]
    

    如果传:

    注意是大写的 PN 就正常啦 可以通过验证

    [GET] /v1/api/test/test_users?P=1&N=15
    

    附上代码:

    用了中间件去加载验证器及验证翻译包

    import (
        "gin-test/common"
        "github.com/gin-gonic/gin"
        ut "github.com/go-playground/universal-translator"
        "gopkg.in/go-playground/validator.v9"
        "log"
    )
    
    type Page struct {
        P uint `json:"p" validate:"required,min=1"`
        N uint `json:"n" validate:"required,min=1"`
    }
    
    // GetPage get page parameters
    func GetPage(c *gin.Context) (int, int) {
        currentPage := 0
    
        v, _ := c.Get("trans")
    
        trans, ok := v.(ut.Translator)
        if !ok {
            trans, _ = common.Uni.GetTranslator("zh")
        }
    
        var p Page
        if err := c.ShouldBindQuery(&p); err != nil {
           log.Println(err)
        }
        
        err := common.Validate.Struct(p)
        if err != nil {
           errs := err.(validator.ValidationErrors)
           var sliceErrs [] string
           for _, e := range errs {
               sliceErrs = append(sliceErrs, e.Translate(trans))
           }
           log.Println(sliceErrs)
        }
        
        //if page > 0 {
        //    currentPage = (page - 1) * limit
        //}
        
        return currentPage, 0
    }
    
    4 条回复    2019-08-30 09:04:55 +08:00
    Aumujun
        1
    Aumujun  
       2019-08-29 18:25:29 +08:00 via Android
    不传大写的人家外面咋调用哇
    JRyan
        2
    JRyan  
       2019-08-29 18:50:00 +08:00
    你把 p 结构体打出来,看是不是没 bind 上数据,validate 是验证结构体里的数据的
    StarUDream
        3
    StarUDream  
       2019-08-29 19:35:19 +08:00   ❤️ 1
    试试 `form`

    ```go
    type Page struct {
    P uint `json:"p" form:"p" validate:"required,min=1"`
    N uint `json:"n" form:"n" validate:"required,min=1"`
    }
    ```

    [https://github.com/gin-gonic/gin#only-bind-query-string]( https://github.com/gin-gonic/gin#only-bind-query-string)
    fhy1994
        4
    fhy1994  
    OP
       2019-08-30 09:04:55 +08:00
    @StarUDream #3
    感谢老哥 加上 `form:"p"` 就能获取到了
    看来还要多看文档
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1254 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:22 · PVG 07:22 · LAX 16:22 · JFK 19:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.