验证 POST JSON 正文匹配结构

Posted

技术标签:

【中文标题】验证 POST JSON 正文匹配结构【英文标题】:Validating POST JSON body matches struct 【发布时间】:2019-11-13 19:55:48 【问题描述】:

我无法验证传递给我的 POST 端点的 JSON 主体是否与为可接受的 JSON 主体创建的结构相匹配。任何帮助将不胜感激

type NewUser struct 
    UserID   string `json:"user_id"`
    UserName string `json:"user_name"`


func AddUser(w http.ResponseWriter, r *http.Request) 
    w.Header().Set("Content-Type", "application/json")

    decoder := json.NewDecoder(r.Body)

    var user NewUser
    err := decoder.Decode(&user)

    if err != nil 
        http.Error(w, err.Error(), http.StatusBadRequest)
    
    user.UserID != NewUser.UserID
        http.Error(w, "error", http.StatusBadRequest),
    


【问题讨论】:

我认为你不需要那个,你不需要知道 json 是否与结构匹配,你只需要知道你所在的结构实例是否解码该json,表示“模型”的有效实例。但是,如果您确定需要将通过线路的内容限制为完全匹配,in structure,一些预定义的模式,那么您无法使用标准 encoding/json 库来做到这一点。您要么必须寻找第 3 方库,要么实现自己的 json-structure-matching 解决方案。 感谢您的洞察! 您无法检查“JSON 是否与结构匹配”。它正在将苹果与橙子进行比较。您可以序列化一个结构并查看您获得的 JSON 是否与您期望的 JSON 匹配,或者您可以将 JSON 反序列化为一个结构并查看您获得的结构是否与您期望的结构匹配。但是将结构与 JSON 进行比较就像将阿根廷与苹果派进行比较。 【参考方案1】:

您可以通过多种方式实现这一目标,但严格程度不同:

您可以检查 UserID 和 UserName 是否为非空。这不会验证输入是否与结构匹配。如果这些字段出现在输入中,它只会捕获用户 ID 和名称。

如果可以接受空值,可以使用*string 代替string,并检查指针是否为nil。如果指针为 nil,则该字段不会出现在 JSON 中,或者显示为 nil。如果它显示为空字符串,则指针不会为零,但字符串将为空。如果提交的 JSON 中有其他字段,此方法也接受。

1234563你认得。

一般而言,如果您需要进行严格验证,您可以使用 json 模式,并检查输入是否与您期望的模式相匹配。这通常比它的价值更麻烦。

【讨论】:

感谢您的详细回复!我试一试

以上是关于验证 POST JSON 正文匹配结构的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure API 管理器中验证 POST 请求正文

node.js 路由验证 json 正文

如何根据使用wiremock和JSON的请求正文匹配获得响应

请求正文参数的 Postman Mock Server 匹配算法逻辑

无法解析请求正文。确保请求正文与指定的内容类型匹配:应用程序/json [重复]

如何使用 C# 在 POST 请求中发送 json 请求正文数据