#api #go #middleware #go-gin
#API #Вперед #промежуточное программное обеспечение #go-gin
Вопрос:
Я создал базовый CRUD API с использованием Go-Gin. Вызов 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(amp;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(amp;user)
fmt.Println(user)
err := Models.CreateUser(amp;user)
return
}
Работает нормально, если BindJSON в промежуточном программном обеспечении удален. Возможно ли, что вы можете привязать JSON только один раз? Что я должен сделать, чтобы снова получить этот объект в моем обработчике запроса?
Ответ №1:
Предназначен c.bindJSON()
для использования в исходном обработчике запроса, а не в промежуточном программном обеспечении. Если вы хотите, вы можете передать данные в свое промежуточное программное обеспечение, используя context https://www.nicolasmerouze.com/share-values-between-middlewares-context-golang но я думаю, что это может стать уродливым quik.
Если вы просто хотите выполнить проверку JSON, я бы рекомендовал выполнить эту логику в вашем обработчике, а не в промежуточном программном обеспечении.