es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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:

    • Los campos de la struct deben ser exportados (es decir, comenzar con una letra mayúscula)
    • Las etiquetas json, xml y form deben estar en minúscula (es decir, json:"email" en lugar de json:"email")
    • Las etiquetas json y xml 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:

    type SigninData struct {
        Email    string `form:"email"`
        Password string `form:"password"`
    }
    

    Además, asegúrate de actualizar el código para referirte a los campos de la struct actualizados como data.Email y data.Password en lugar de data.email y data.password.

    Con estos cambios, el método c.BodyParser(&data) debería poder analizar correctamente los datos del formulario en la struct SigninData.

Comments are closed.