我正在使用Beego开发Web服务器。
我使用beego.Controller处理POST请求。就我而言,POST请求包含一个JSON:

{
    "name": "titi",
    "password": "123456"
}
这是我的代码:
type TestController struct {
    beego.Controller
}

type User struct {
    Name     string `json:"name"`
    Password string `json:"password"`
}

func (c *TestController) Post() {
    var ob md.User
    var err error
    if err = json.Unmarshal(c.Ctx.Input.RequestBody, &ob); err == nil {
        logs.Debug(ob.Name)
        logs.Debug(len(ob.Name))
    } else {
        logs.Error("illegal JSON")
    }
}
这段代码可以正常工作。借助于struct User的标签,将"name"分配给ob.Name,并且将"password"分配给ob.Password
现在,我想测试一些异常情况。例如,如果JSON请求未包含预期的密钥,该怎么办:
{
    "illegalKey1": "titi",
    "illegalKey2": "123456"
}
如您所见,我期望使用"name""password",但是现在密钥变成了"illegalKey1""illegalKey2"。因此,我认为这可能会导致一些错误。
令我惊讶的是,没有任何错误,因为err == nil仍然为true,并且len(ob.Name)现在变为0。
那么在Go / Beego中是否有一些好的方法可以处理这种情况?
我的意思是,我知道
if len(ob.Name) == 0 {
    logs.Error("illegal JSON")
}
可以,但是我想知道是否存在某种更漂亮的代码?否则,如果JSON中有10个字段,那么我必须做一次if 10次。显然这根本不好。

最佳答案

为了确保JSON不包含意外字段,您可以使用Decoder包中的"encoding/json"及其方法DisallowUnknownFields。在这里查看示例https://play.golang.org/p/bif833qxytE
请注意,json.NewDecoderio.Reader作为输入。您可以使用bytes.NewReaderio.Reader创建[]byte另一个主题是确保JSON包含所有期望的字段(或这些字段采用某种格式)。如何使其与"encoding/json"包一起工作的答案是对结构实现自定义UnmarshalJSON,可以找到here。但是我不建议对这种任务使用这种方法,因为基本上这是对输入的验证,而我宁愿使用验证包来避免混合职责。最常见的一种是go-playground/validator.v9,您应该在其中查找required标签。验证案例在here中讨论。

关于json - 如何使用Beego在POST请求中验证JSON消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63260506/

10-11 22:16
查看更多