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

标签 json go beego

我正在使用 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 仍然为真,而 len(ob.Name) 现在只是变为 0。
那么在 Go/Beego 中是否有一些好的方法来处理这种情况?
我的意思是,我知道
if len(ob.Name) == 0 {
    logs.Error("illegal JSON")
}
没关系,但我想知道是否有某种更漂亮的代码?否则,如果 JSON 中有 10 个字段,我必须执行 10 次这样的 if。显然,这根本不好。

最佳答案

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

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

相关文章:

php - jQuery ajax POST 数据变量最多可容纳 199 个 json 数组

php - MySQL 仅当该记录的日期时间列数据发生更改时才更新该数据

go - 在 golang 中 slice unicode/ascii 字符串?

json - this.input.get() 不起作用 beego

javascript - 从 JSON 对象获取最大值 D3JS

perl - 在 perl 中解码 UTF-8 JSON 的问题

elasticsearch - 如何在 elasticsearch 中只存储有限数量的文档。

sql-server - sql : Scan error on column index 0, name "": unsupported Scan, 将 driver.Value 类型 int64 存储到类型 *main.SMSBlast 中?

csv - 输出到 csv 文件会将数据转储到浏览器,但不会转储到文件

go - 在 Go 模板中使用 {{}} 原始表达式