我正在使用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")
}
}
这段代码可以正常工作。随着结构体标签的帮助下User
,"name"
被分配到ob.Name
和"password"
分配到ob.Password
。
现在,我想测试一些异常情况。例如,如果JSON请求未包含预期的密钥,该怎么办:
{
"illegalKey1": "titi",
"illegalKey2": "123456"
}
如您所见,我期待着"name"
,"password"
但是现在密钥变成了"illegalKey1"
和"illegalKey2"
。因此,我认为这可能会导致一些错误。
令我惊讶的是,没有任何错误,因为err == nil
它仍然是正确的,并且len(ob.Name)
现在变为0。
那么在Go / Beego中是否有一些好的方法可以处理这种情况?
我的意思是,我知道
if len(ob.Name) == 0 {
logs.Error("illegal JSON")
}
可以,但是我想知道是否存在某种更漂亮的代码?否则,如果JSON中有10个字段,则必须执行if
10次。显然这根本不好。
为了确保JSON不包含意外字段,您可以Decoder
在"encoding/json"
package及其方法DisallowUnknownFields中使用。在此处查看示例https://play.golang.org/p/bif833qxytE
请注意,json.NewDecoder
需要io.Reader
作为输入。您可以创建io.Reader
从[]byte
使用bytes.NewReader
另一个主题是确保JSON包含所有期望的字段(或这些字段采用某种格式)。有关如何使其与"encoding/json"
包一起使用的答案是对UnmarshalJSON
结构实现自定义,请参见此处。但是我不建议对这种任务使用这种方法,因为基本上这是对输入的验证,而我宁愿使用验证包来避免混合职责。最常见的一种是go-playground / validator.v9,您应该在其中寻找required
标签。验证案例在这里讨论。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句