如何解决在中间件中调用BindJSON后无法从请求处理程序中的请求访问json数据
我已经使用Go-Gin创建了基本的CRUD API。在中间件中调用BindJSON后,在请求处理程序中调用BindJSON给我一个空白对象,但是如果我在中间件中删除BindJSON,则可以正常工作。
这是用户模型:
type User struct {
ID uint `json:"id" gorm:"primary_key"`
Rollnum string `json:"rollnum" gorm:"primary_key;unique"`
Name string `json:"name"`
Email string `json:"email"`
Phone uint `json:"phone"`
Address string `json:"address"`
}
这是我的中间件:
func NameMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
var user Models.User
c.BindJSON(&user)
fmt.Println(user.Rollnum)
if user.Name == "" {
c.JSON(http.StatusNotFound,gin.H{"No Key": "Name"})
c.AbortWithStatus(http.StatusNotFound)
}
}
}
这是我的路线:
r := gin.Default()
grp1 := r.Group("/user-api")
grp1.POST("user",Middleware.NameMiddleware(),Controllers.CreateUser)
这是我的POST请求处理程序:
func CreateUser(c *gin.Context) {
var user Models.User
c.BindJSON(&user)
fmt.Println(user)
err := Models.CreateUser(&user)
return
}
如果中间件中的BindJSON被删除,则工作正常。有可能您只能一次绑定BindJSON吗?我该怎么做才能再次在请求处理程序中获取该对象?
解决方法
c.bindJSON()
旨在用于初始请求处理程序,而不用于中间件。如果需要,您可以使用上下文https://www.nicolasmerouze.com/share-values-between-middlewares-context-golang将数据传递到中间件,但是我认为这可能会很麻烦。
如果您只想对JSON进行验证,建议您在处理程序中而不是在中间件中执行此逻辑。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。