go - 验证 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),
}
}
解决方案
有多种方法可以实现这一目标,但严格程度不同:
您可以检查 UserID 和 UserName 是否为非空。这将不会验证输入是否与结构匹配。如果这些字段出现在输入中,它只会捕获用户 ID 和名称。
如果可以接受空值,您可以使用
*string
代替string
,并检查指针是否为 nil。如果指针为 nil,则该字段不会出现在 JSON 中,或者显示为 nil。如果它显示为空字符串,则指针不会为零,但字符串将为空。如果提交的 JSON 中有其他字段,此方法也接受。对于这种特定情况,如果您想确保没有传递其他无法识别的字段,您可以将主体解组为
interface{}
,并确保它最多包含两个字段,并且这些是您识别的字段。
一般来说,如果您需要进行严格验证,您可以使用 json 模式,并检查输入是否符合您期望的模式。这通常比它的价值更麻烦。
推荐阅读
- node.js - 在 Azure 中创建 NodeJS Web 应用程序失败
- windows - 我可以将 iPhone 连接到 Windows 10 机器以查看我在 Flutter 中的工作吗?
- java - 重置单选按钮中的数据
- mysql - Sequelize 更新忽略无效的列名
- path - 谷歌 colab 上的 Fastai
- python - 将元素插入到numpy数组中,以便最小间距是任意的
- python - 在为它们分配类型的同时保持空值在熊猫数据框列中的样子
- safari - Safari 使我的一些文本出现乱码和扭曲;选择文本会稍微清理一下
- php - php数组插入不是最后而是第一个
- csv - Plots.jl 中包含空格的列名