如何使用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")
    }
}

这段代码可以正常工作。随着结构体标签的帮助下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个字段,则必须执行if10次​​。显然这根本不好。

DC Joo:

为了确保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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在JSON对象中验证请求-使用Laravel

如何在批量(JSON 对象数组)POST 请求中为每个实例返回错误消息?

如何使用请求验证 JSON 输入?Laravel

如何在JSON模式中使用oneOf来验证POST和PATCH请求?

如何确保使用POST请求从我的应用中对用户进行身份验证?

如何使用Guzzle以JSON发送POST请求?

如何使用Django REST API验证android用户POST请求?

如何在Slim中访问POST请求的JSON请求正文?

如何捕获JSON请求消息

如何在MockRestServiceServer中验证JSON请求主体

如何在驼峰休息中验证JSON请求

如何在Symfony 3.4中正确验证JSON请求

Json 代码验证错误 Curl Post 请求

如何在Django 1.6中使用HTTP POST请求接收json数据?

如何将会话从身份验证器 POST 请求转发到 JAVA 中的 GET 请求?

如何使用 selenium webdriver 验证表中的工具提示消息?

如何使用JavaScript防止Adobe Livecycle中的重复验证消息

如何使用令牌身份验证对 Post 请求进行身份验证?

POST请求在beego框架上被视为OPTIONS

如何使用注释在SOAP Spring Web Services中验证请求

如何在plsql中以json格式发送POST请求

如何从 Json 格式的 POST 请求中获取对象列表

如何从 Angular 中的 http post 请求获取原始 JSON 输出?

如何使用NodeJS在POST请求中发送JSON

如何使用Nginx和Lua处理POST请求的JSON主体?

如何在SprayTest中使用JSON主体模拟POST请求?

如何在Qt中使用JSON正文发送POST请求

如何使用Volley发送带有JSON正文的POST请求?

如何使用 Httparty 在 Ruby 中的 javascript 中重写 Post 请求