gpt4 book ai didi

go - 如何在 Golang 中绑定(bind) JSON

转载 作者:IT王子 更新时间:2023-10-29 01:08:47 25 4
gpt4 key购买 nike

我正在将表单数据传递给 Go 中的 Controller 。我已经验证数据正在到达 Controller ,因为它的值出现在这些变量中:

emailValue := c.PostForm("email");
passwordValue := c.PostForm("password");

但是,我在 boilerplate project 工作尝试自学 Go,我对其中包含的一些进一步处理感到困惑。 “无效的登录表单”错误总是在以下函数中触发:

func (ctrl UserController) Signin(c *gin.Context) {
var signinForm forms.SigninForm

if c.BindJSON(&signinForm) != nil {
c.JSON(406, gin.H{"message": "Invalid signin form", "form": signinForm})
c.Abort()
return
}

user, err := userModel.Signin(signinForm)
if err == nil {
session := sessions.Default(c)
session.Set("user_id", user.ID)
session.Set("user_email", user.Email)
session.Set("user_name", user.Name)
session.Save()

c.JSON(200, gin.H{"message": "User signed in", "user": user})
} else {
c.JSON(406, gin.H{"message": "Invalid signin details", "error": err.Error()})
}

}

我无法通过阅读文档和其他 Stack Overflow 问题弄清楚 BindJSON 在这种情况下到底在做什么。以下是 forms 文件中的相关 struct:

type SigninForm struct {
Email string `form:"email" json:"email" binding:"required,email"`
Password string `form:"password" json:"password" binding:"required"`
}

BindJSON 在做什么,我如何确保 c.BindJSON(&signinForm) == nil

最佳答案

我可能在这里误解了,但如果您的内容在 PostForm 调用中可用,那么我会假设 Content-Type 不是 application/json 但可能是 application/x-www-form-urlencoded。如果是这种情况,则使用 BindJSON 将不起作用,因为它试图将发布数据绑定(bind)到通过将发布数据解析为 json 定义的结构。我认为这可能有效:

if err := c.ShouldBindWith(&signinForm, binding.Form); err != nil {
c.JSON(406, gin.H{"message": "Invalid signin form", "form": signinForm})
c.Abort()
return
}

另一种方法是将您的帖子数据实际发送为 json,类似于:

{"email": "test@example.com", "password": "pass"}

并确保 Content-Type header 是 application/json

我从未使用过 Gin,所以这可能是完全错误的。

关于go - 如何在 Golang 中绑定(bind) JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48912343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com