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

[json 的验证]后端的 json 验证

  •  1
     
  •   guanzhangzhang ·
    zhangguanzhang · 2019-09-01 17:19:51 +08:00 · 4261 次点击
    这是一个创建于 1670 天前的主题,其中的信息可能已经有所发展或是发生改变。

    后端用 gin 写个自用的接口,假设结构体为下面

    type Machine struct {
        Hostname string `json:"Hostname,omitempty" binding:"required"`
        DeviceLabel string `json:"DeviceLabel,omitempty" binding:"required"`
    }
    

    POST 接口必要的字段都写了 required 了,但是更新的时候发来的 json 的不一定会是全面的(也就不能用 gin 的 c.BindJson ),所以目前是下面写的

    	var data models.Machines
    
    	if err := json.NewDecoder(c.Request.Body).Decode(&data); err != nil {
    		c.JSON( http.StatusOK, gin.H{
    			"status": 1,
    			"msg":    err.Error(),
    		})
    		return
    	}
    

    但是这样我测试了下任何正确的 json 都不会为 nil,例如:

    {"asdasd":"asdasfdsf"}
    

    搜了下 beego 的 validation 包也不能达到要求,如何让用户只能传递符合结构体的 json

    12 条回复    2019-09-04 02:51:20 +08:00
    guanzhangzhang
        1
    guanzhangzhang  
    OP
       2019-09-01 17:41:33 +08:00
    打错了,是一直都 nil
    guanzhangzhang
        2
    guanzhangzhang  
    OP
       2019-09-01 18:05:42 +08:00
    是 err 一直都 nil
    Carseason
        3
    Carseason  
       2019-09-01 18:09:57 +08:00 via iPhone
    除非你传递的不是合格的 json 数据才会有错误的
    guanzhangzhang
        4
    guanzhangzhang  
    OP
       2019-09-01 18:14:46 +08:00
    @Carseason 那我感觉这函数都没啥卵用,或者平时的开发中,后端接口都不去检查 json 的 key 是否随便写吗
    Cbdy
        5
    Cbdy  
       2019-09-01 19:24:35 +08:00
    guanzhangzhang
        6
    guanzhangzhang  
    OP
       2019-09-01 20:01:45 +08:00
    @Cbdy 我感觉你都没看懂问题。。。
    Mitt
        7
    Mitt  
       2019-09-01 20:05:36 +08:00
    这样在 Go 里是不行的,你必须调用 gin 的 json-check 方法去检查 json 是否合法,因为 binding 是 gin 库里的,你调的 json 是标准库里的
    Mitt
        8
    Mitt  
       2019-09-01 20:07:41 +08:00
    网上随便找了一篇你可以参考一下 https://www.yoytang.com/go-gin-doc.html 跳转到 数据验证 部分
    heimeil
        9
    heimeil  
       2019-09-01 20:31:13 +08:00
    https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBind

    ShouldBindXXX 不会直接发送错误响应,返回错误还能继续其他逻辑
    xzc19970719
        10
    xzc19970719  
       2019-09-01 21:20:09 +08:00
    为啥不去 A 站文章区???
    guanzhangzhang
        11
    guanzhangzhang  
    OP
       2019-09-03 10:11:13 +08:00
    @Mitt 不是,是 json 本身合法,但是 key 随便写,我现在给 model 的结构体加了个 IsEmpty 的方法整的,这样凑合着用吧
    Mitt
        12
    Mitt  
       2019-09-04 02:51:20 +08:00
    @guanzhangzhang 数据验证是验证你 binding:"required" 这部分,不是验证 json 本身合法性的,是验证结构合法性的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1377 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:38 · PVG 01:38 · LAX 10:38 · JFK 13:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.