Convertir una solicitud POST de API REST de JSON a form-data en el framework de Golang gofiber.
Tengo el siguiente código que funciona para JSON en el cuerpo de la solicitud POST, pero ahora quiero convertirlo utilizando form-data en el cuerpo de la solicitud.
Aquí está lo que tengo:
func Signin(c *fiber.Ctx) error {
var data map[string]string
if err := c.BodyParser(&data); err != nil {
return err
}
var user models.User
findUser := database.DB.Where("email = ?", data.email).First(&user)
token, err := middlewares.GenerateJWT(user.Email)
if err != nil {
c.Status(fiber.StatusBadRequest)
return c.JSON(fiber.Map{
"message": "Credenciales inválidas",
})
}
cookie := fiber.Cookie{
Name: "access_token",
Value: token,
Expires: time.Now().Add(time.Hour * 24),
HTTPOnly: true,
Secure: true,
}
c.Cookie(&cookie)
return c.JSON(fiber.Map{
"access_token": token,
"token_type": "bearer",
})
Esto funciona correctamente para el cuerpo raw JSON, pero quiero cambiarlo a cuerpo form-data.
He intentado muchas cosas, incluyendo esto, pero sin éxito:
func Signin(c *fiber.Ctx) error {
type SigninData struct {
email string `json:"email" xml:"email" form:"email"`
password string `json:"password" xml:"password" form:"password"`
}
data := new(SigninData)
if err := c.BodyParser(&data); err != nil {
return err
}
var user models.User
findUser := database.DB.Where("email = ?", data.email).First(&user)
token, err := middlewares.GenerateJWT(user.Email)
if err != nil {
c.Status(fiber.StatusBadRequest)
return c.JSON(fiber.Map{
"message": "Credenciales inválidas",
})
}
cookie := fiber.Cookie{
Name: "access_token",
Value: token,
Expires: time.Now().Add(time.Hour * 24),
HTTPOnly: true,
Secure: true,
}
c.Cookie(&cookie)
return c.JSON(fiber.Map{
"access_token": token,
"token_type": "bearer",
})
}
Pero obtengo el siguiente error:
schema: la interfaz debe ser un puntero a una estructura
¿Qué me falta por corregir para que esto acepte form-data?
davy.ai
El mensaje de error “El esquema: la interfaz debe ser un puntero a struct” sugiere que el método
c.BodyParser()
no puede analizar los datos del formulario en la struct esperada. Esto puede ser debido a algunas razones:json
,xml
yform
deben estar en minúscula (es decir,json:"email"
en lugar dejson:"email"
)json
yxml
podrían no ser necesarias en este caso, ya que estamos tratando con datos del formulario.Intenta actualizar la definición de tu struct de la siguiente manera:
Además, asegúrate de actualizar el código para referirte a los campos de la struct actualizados como
data.Email
ydata.Password
en lugar dedata.email
ydata.password
.Con estos cambios, el método
c.BodyParser(&data)
debería poder analizar correctamente los datos del formulario en la structSigninData
.