验证 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 中有其他字段,此方法也接受。
一般而言,如果您需要进行严格验证,您可以使用 json 模式,并检查输入是否与您期望的模式相匹配。这通常比它的价值更麻烦。
【讨论】:
感谢您的详细回复!我试一试以上是关于验证 POST JSON 正文匹配结构的主要内容,如果未能解决你的问题,请参考以下文章
如何根据使用wiremock和JSON的请求正文匹配获得响应
请求正文参数的 Postman Mock Server 匹配算法逻辑