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

我正在使用 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 次。显然,这根本不好。


大话西游666
浏览 190回答 1
1回答

牧羊人nacy

为了确保 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标签。这里讨论验证案例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go