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

2019-08-29 18:04:10 +08:00
 fhy1994

最近在研究 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
}
4087 次点击
所在节点    Go 编程语言
4 条回复
Aumujun
2019-08-29 18:25:29 +08:00
不传大写的人家外面咋调用哇
JRyan
2019-08-29 18:50:00 +08:00
你把 p 结构体打出来,看是不是没 bind 上数据,validate 是验证结构体里的数据的
StarUDream
2019-08-29 19:35:19 +08:00
试试 `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
2019-08-30 09:04:55 +08:00
@StarUDream #3
感谢老哥 加上 `form:"p"` 就能获取到了
看来还要多看文档

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/596292

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX