我已经使用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,则工作正常。是否可以只绑定JSON一次?我应该怎么做才能在请求处理程序中再次获得该对象?
c.bindJSON()
用于初始请求处理程序,而不是中间件。如果需要,可以使用上下文将数据传递给中间件https://www.nicolasmerouze.com/share-values-between-middlewares-context-golang但我认为这可能会变得丑陋。
如果您只想对JSON执行验证,我建议您在处理程序中执行此逻辑,而不是在中间件中执行。