首页 > 解决方案 > 验证 POST JSON 正文匹配结构

问题描述

我无法验证传递给我的 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),
    }

}

标签: gopoststructmux

解决方案


有多种方法可以实现这一目标,但严格程度不同:

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

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

  • 对于这种特定情况,如果您想确保没有传递其他无法识别的字段,您可以将主体解组为interface{},并确保它最多包含两个字段,并且这些是您识别的字段。

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


推荐阅读