【问题标题】:Validating POST JSON body matches struct验证 POST JSON 正文匹配结构
【发布时间】: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 进行比较就像将阿根廷与苹果派进行比较。

标签: go post struct mux


【解决方案1】:

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

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

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

  • 1234563你认得。

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

【讨论】:

  • 感谢您的详细回复!我试一试
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2015-12-01
  • 1970-01-01
  • 2020-07-31
相关资源
最近更新 更多