Невозможно получить доступ к данным json из запроса в обработчике запроса после вызова BindJSON в промежуточном программном обеспечении

#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, я бы рекомендовал выполнить эту логику в вашем обработчике, а не в промежуточном программном обеспечении.