Saltearse al contenido

Valores predeterminados para campos de formulario

A veces quieres que un campo use un valor predeterminado cuando el cliente no envía un valor. El enlace de formularios de Gin soporta valores predeterminados mediante la opción default en la etiqueta de struct form. Esto funciona para escalares y, a partir de Gin v1.11, para colecciones (slices/arrays) con formatos de colección explícitos.

Puntos clave:

  • Coloca el valor predeterminado justo después de la clave del formulario: form:"name,default=William".
  • Para colecciones, especifica cómo dividir valores con collection_format:"multi|csv|ssv|tsv|pipes".
  • Para multi y csv, usa punto y coma en el valor predeterminado para separar valores (ej. default=1;2;3). Gin los convierte a comas internamente para que el analizador de etiquetas no sea ambiguo.
  • Para ssv (espacio), tsv (tabulador) y pipes (|), usa el separador natural en el valor predeterminado.

Ejemplo:

package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
type Person struct {
Name string `form:"name,default=William"`
Age int `form:"age,default=10"`
Friends []string `form:"friends,default=Will;Bill"` // multi/csv: use ; in defaults
Addresses [2]string `form:"addresses,default=foo bar" collection_format:"ssv"`
LapTimes []int `form:"lap_times,default=1;2;3" collection_format:"csv"`
}
func main() {
r := gin.Default()
r.POST("/person", func(c *gin.Context) {
var req Person
if err := c.ShouldBind(&req); err != nil { // infers binder by Content-Type
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, req)
})
_ = r.Run(":8080")
}

Si haces POST sin ningún cuerpo, Gin responde con los valores predeterminados:

Ventana de terminal
curl -X POST http://localhost:8080/person

Respuesta (ejemplo):

{
"Name": "William",
"Age": 10,
"Friends": ["Will", "Bill"],
"Addresses": ["foo", "bar"],
"LapTimes": [1, 2, 3]
}

Notas y advertencias:

  • Las comas son usadas por la sintaxis de etiquetas de struct de Go para separar opciones; evita comas dentro de los valores predeterminados.
  • Para multi y csv, los punto y coma separan los valores predeterminados; no incluyas punto y coma dentro de los valores predeterminados individuales para estos formatos.
  • Valores inválidos de collection_format resultarán en un error de enlace.

Cambios relacionados:

  • Los formatos de colección para enlace de formularios (multi, csv, ssv, tsv, pipes) fueron mejorados alrededor de v1.11.
  • Los valores predeterminados para colecciones fueron añadidos en v1.11 (PR #4048).