为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Beego 验证 POST 请求中的 JSON 消息

如何使用 Beego 验证 POST 请求中的 JSON 消息

Go
大话西游666 2022-06-21 16:22:11
我正在使用 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"and"password"但现在键变为"illegalKey1"and "illegalKey2"。所以我认为这可能会导致一些错误。令我惊讶的是,没有任何错误,因为err == nil它仍然是正确的,len(ob.Name)现在只是变成了 0。那么在 Go/Beego 中是否有一些好的方法来处理这种情况?我的意思是,我知道if len(ob.Name) == 0 {    logs.Error("illegal JSON")}没关系,但我想知道是否有某种更漂亮的代码?否则,如果 JSON 中有 10 个字段,我必须这样做if10 次。显然,这根本不好。
查看完整描述

1 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

为了确保 JSON 不包含您可以Decoder"encoding/json"包和它的方法DisallowUnknownFields中使用的意外字段。请参阅此处的示例https://play.golang.org/p/bif833qxytE

请注意,以json.NewDecoder作为io.Reader输入。您可以io.Reader使用[]bytebytes.NewReader创建

另一个主题是确保 JSON 包含所有预期的字段(或这些字段采用某种格式)。如何使其与"encoding/json"包一起使用的答案是为结构实现自定义UnmarshalJSON,可以在这里找到。但我不建议对此类任务使用这种方法,因为基本上这是对输入的验证,我宁愿为此使用验证包而不是混合职责。最常见的是go-playground/validator.v9,您应该在其中查找required标签。这里讨论验证案例。


查看完整回答
反对 回复 2022-06-21
  • 1 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信