Skip to content

Commit 34ea72a

Browse files
committed
docs(i18n): guide (es)
1 parent 1f37948 commit 34ea72a

14 files changed

Lines changed: 1741 additions & 0 deletions
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
---
2+
title: Binding
3+
description: Analiza datos de request en structs Go tipados desde path, query, header y body.
4+
sidebar:
5+
order: 5
6+
---
7+
8+
Analizar datos de request es una parte crucial de una aplicación web. En Echo esto se llama
9+
_binding_, y puede leer desde cuatro partes de un request HTTP:
10+
11+
- Parámetros de path de URL
12+
- Parámetros de query de URL
13+
- Headers
14+
- Body del request
15+
16+
## Binding con tags de struct
17+
18+
Define un struct con tags que especifican el origen de datos y la clave, y luego llama a `c.Bind()`
19+
con un puntero a él. Aquí el parámetro de query `id` se vincula al campo `ID`:
20+
21+
```go
22+
type User struct {
23+
ID string `query:"id"`
24+
}
25+
26+
// handler for /users?id=<userID>
27+
var user User
28+
if err := c.Bind(&user); err != nil {
29+
return c.String(http.StatusBadRequest, "bad request")
30+
}
31+
```
32+
33+
### Orígenes de datos
34+
35+
| Tag | Origen |
36+
| -------- | ------ |
37+
| `query` | Parámetro de query |
38+
| `param` | Parámetro de path |
39+
| `header` | Valor de header |
40+
| `form` | Datos de formulario (query + body) |
41+
| `json` | Body del request (`encoding/json`) |
42+
| `xml` | Body del request (`encoding/xml`) |
43+
44+
Los campos de path, query, header y form requieren un **tag explícito**. JSON y XML usan
45+
el nombre del campo del struct cuando se omite el tag, igual que la biblioteca estándar.
46+
47+
### Content types del body
48+
49+
Al decodificar el body del request, el header `Content-Type` selecciona el decoder:
50+
51+
- `application/json`
52+
- `application/xml`
53+
- `application/x-www-form-urlencoded`
54+
55+
### Múltiples orígenes y precedencia
56+
57+
Un campo puede declarar varios orígenes. Los datos se vinculan en este orden, y cada paso
58+
sobrescribe el anterior:
59+
60+
1. Parámetros de path
61+
2. Parámetros de query (solo GET / DELETE)
62+
3. Body del request
63+
64+
```go
65+
type User struct {
66+
ID string `param:"id" query:"id" form:"id" json:"id" xml:"id"`
67+
}
68+
```
69+
70+
### Binding directo desde un origen
71+
72+
```go
73+
echo.BindBody(c, &payload) // request body
74+
echo.BindQueryParams(c, &payload) // query parameters
75+
echo.BindPathValues(c, &payload) // path parameters
76+
echo.BindHeaders(c, &payload) // headers
77+
```
78+
79+
:::note
80+
Los headers **no** están incluidos por `c.Bind()`. Vincúlalos directamente con `echo.BindHeaders`.
81+
:::
82+
83+
:::caution[Seguridad]
84+
No vincules directamente a structs de negocio. Si un struct vinculado expone un campo `IsAdmin bool`,
85+
un body de request `{"IsAdmin": true}` lo establecería. Usa un DTO dedicado y mapéalo explícitamente:
86+
:::
87+
88+
```go
89+
type UserDTO struct {
90+
Name string `json:"name" form:"name" query:"name"`
91+
Email string `json:"email" form:"email" query:"email"`
92+
}
93+
94+
e.POST("/users", func(c *echo.Context) error {
95+
var dto UserDTO
96+
if err := c.Bind(&dto); err != nil {
97+
return c.String(http.StatusBadRequest, "bad request")
98+
}
99+
user := User{Name: dto.Name, Email: dto.Email, IsAdmin: false}
100+
executeSomeBusinessLogic(user)
101+
return c.JSON(http.StatusOK, user)
102+
})
103+
```
104+
105+
## Binding fluido
106+
107+
Para binding explícito y type-safe desde un único origen, usa los binders fluidos. Encadenan
108+
la configuración y la ejecutan, recopilando errores:
109+
110+
```go
111+
// /api/search?active=true&id=1&id=2&id=3&length=25
112+
var opts struct {
113+
IDs []int64
114+
Active bool
115+
}
116+
length := int64(50)
117+
118+
err := echo.QueryParamsBinder(c).
119+
Int64("length", &length).
120+
Int64s("id", &opts.IDs).
121+
Bool("active", &opts.Active).
122+
BindError() // first error, if any
123+
```
124+
125+
Binders disponibles: `echo.QueryParamsBinder(c)`, `echo.PathValuesBinder(c)`,
126+
`echo.FormFieldBinder(c)`. Termina una cadena con `BindError()` (primer error) o
127+
`BindErrors()` (todos los errores). `FailFast(false)` ejecuta toda la cadena; está activado por defecto.
128+
129+
Cada tipo soportado ofrece métodos `Type(...)`, `MustType(...)`, `Types(...)` (slices) y
130+
`MustTypes(...)`, por ejemplo `Int64`, `MustInt64`, `Int64s`. Usa
131+
`BindWithDelimiter("id", &dest, ",")` para separar valores unidos por comas.
132+
133+
## Binder personalizado
134+
135+
Registra un binder personalizado mediante `Echo#Binder`:
136+
137+
```go
138+
type CustomBinder struct{}
139+
140+
func (cb *CustomBinder) Bind(c *echo.Context, i any) error {
141+
db := new(echo.DefaultBinder)
142+
if err := db.Bind(c, i); err != echo.ErrUnsupportedMediaType {
143+
return err
144+
}
145+
// custom logic here
146+
return nil
147+
}
148+
149+
e.Binder = &CustomBinder{}
150+
```
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
---
2+
title: Context
3+
description: El objeto por request que transporta request, response, params y helpers.
4+
sidebar:
5+
order: 4
6+
---
7+
8+
`echo.Context` representa el contexto del request HTTP actual. Se pasa un puntero a él
9+
(`*echo.Context`) a cada handler y middleware, y transporta el request y response,
10+
parámetros de path, datos vinculados y helpers para construir responses.
11+
12+
```go
13+
func handler(c *echo.Context) error {
14+
// ...
15+
return nil
16+
}
17+
```
18+
19+
## Leer entrada
20+
21+
```go
22+
id := c.Param("id") // path parameter
23+
q := c.QueryParam("q") // query string value
24+
all := c.QueryParams() // url.Values of all query params
25+
name := c.FormValue("name") // form field (URL + body)
26+
ua := c.Request().Header.Get(echo.HeaderUserAgent)
27+
```
28+
29+
Hay helpers `*Or` equivalentes que devuelven un valor por defecto cuando el valor no está presente:
30+
`c.ParamOr("id", "0")`, `c.QueryParamOr("page", "1")`, `c.FormValueOr(...)`.
31+
32+
## Escribir responses
33+
34+
```go
35+
c.String(http.StatusOK, "plain text")
36+
c.JSON(http.StatusOK, payload)
37+
c.JSONPretty(http.StatusOK, payload, " ")
38+
c.HTML(http.StatusOK, "<b>hi</b>")
39+
c.XML(http.StatusOK, payload)
40+
c.Blob(http.StatusOK, "application/pdf", bytes)
41+
c.Stream(http.StatusOK, "application/octet-stream", reader)
42+
c.NoContent(http.StatusNoContent)
43+
c.Redirect(http.StatusFound, "/elsewhere")
44+
```
45+
46+
## Archivos
47+
48+
```go
49+
c.File("public/report.pdf") // serve a file
50+
c.Attachment("invoice.pdf", "inv.pdf") // prompt download
51+
c.Inline("photo.png", "photo.png") // render inline
52+
```
53+
54+
## Almacenamiento por request
55+
56+
Comparte datos entre middleware y handlers con `Get`/`Set`:
57+
58+
```go
59+
c.Set("user", u)
60+
u, _ := c.Get("user").(*User)
61+
```
62+
63+
El acceso tipado está disponible mediante los helpers genéricos:
64+
65+
```go
66+
u, err := echo.ContextGet[*User](c, "user")
67+
```
68+
69+
## Binding y validación
70+
71+
`c.Bind()` analiza datos del request en un struct; consulta [Binding](/es/guide/binding/).
72+
73+
```go
74+
var dto CreateUser
75+
if err := c.Bind(&dto); err != nil {
76+
return echo.ErrBadRequest
77+
}
78+
```
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
---
2+
title: Cookies
3+
description: Crea, lee y lista HTTP cookies usando el tipo estándar http.Cookie.
4+
sidebar:
5+
order: 11
6+
---
7+
8+
Una cookie es una pequeña pieza de datos que un servidor envía al navegador, que el navegador
9+
almacena y vuelve a enviar en requests posteriores. Las cookies permiten que los sitios web
10+
recuerden información con estado, como un carrito de compras, el estado de autenticación o
11+
valores de formularios ingresados previamente.
12+
13+
Echo usa el tipo estándar `http.Cookie` de Go para agregar y obtener cookies desde
14+
`echo.Context` en un handler.
15+
16+
## Atributos de Cookie
17+
18+
| Atributo | Opcional |
19+
| ---------- | -------- |
20+
| `Name` | No |
21+
| `Value` | No |
22+
| `Path` ||
23+
| `Domain` ||
24+
| `Expires` ||
25+
| `Secure` ||
26+
| `HttpOnly` ||
27+
28+
## Crear una cookie
29+
30+
```go
31+
func writeCookie(c *echo.Context) error {
32+
cookie := new(http.Cookie)
33+
cookie.Name = "username"
34+
cookie.Value = "jon"
35+
cookie.Expires = time.Now().Add(24 * time.Hour)
36+
c.SetCookie(cookie)
37+
return c.String(http.StatusOK, "write a cookie")
38+
}
39+
```
40+
41+
- Crea la cookie con `new(http.Cookie)`.
42+
- Establece atributos en los campos de `http.Cookie`.
43+
- Llama a `c.SetCookie(cookie)` para agregar un header `Set-Cookie` a la response.
44+
45+
## Leer una cookie
46+
47+
```go
48+
func readCookie(c *echo.Context) error {
49+
cookie, err := c.Cookie("username")
50+
if err != nil {
51+
return err
52+
}
53+
fmt.Println(cookie.Name)
54+
fmt.Println(cookie.Value)
55+
return c.String(http.StatusOK, "read a cookie")
56+
}
57+
```
58+
59+
- Lee una cookie por nombre con `c.Cookie("username")`.
60+
- Accede a sus atributos mediante los campos de `http.Cookie`.
61+
62+
## Leer todas las cookies
63+
64+
```go
65+
func readAllCookies(c *echo.Context) error {
66+
for _, cookie := range c.Cookies() {
67+
fmt.Println(cookie.Name)
68+
fmt.Println(cookie.Value)
69+
}
70+
return c.String(http.StatusOK, "read all the cookies")
71+
}
72+
```
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
---
2+
title: Personalización
3+
description: Personaliza el logger, validator, binder, renderer, serializer y manejo de errores de Echo.
4+
sidebar:
5+
order: 12
6+
---
7+
8+
Echo expone un conjunto de campos en la instancia `Echo` que te permiten reemplazar el
9+
comportamiento integrado con tus propias implementaciones.
10+
11+
## Logging
12+
13+
`Echo#Logger` escribe logs estructurados. El handler por defecto emite JSON a `os.Stdout`.
14+
15+
### Logger personalizado
16+
17+
El logger es un `*slog.Logger`, por lo que puedes registrar cualquier handler de `slog`:
18+
19+
```go
20+
e.Logger = slog.New(slog.NewJSONHandler(os.Stdout, nil))
21+
```
22+
23+
## Validator
24+
25+
`Echo#Validator` registra un validator para validar payloads de request.
26+
27+
[Aprende más](/es/guide/request/#validate-data)
28+
29+
## Binder personalizado
30+
31+
`Echo#Binder` registra un binder personalizado para binding de payloads de request.
32+
33+
[Aprende más](/es/guide/binding/#custom-binder)
34+
35+
## Serializer JSON personalizado
36+
37+
`Echo#JSONSerializer` registra un serializer JSON personalizado. Consulta `DefaultJSONSerializer`
38+
en [json.go](https://github.com/labstack/echo/blob/master/json.go).
39+
40+
## Renderer
41+
42+
`Echo#Renderer` registra un renderer para renderizado de templates.
43+
44+
[Aprende más](/es/guide/templates/)
45+
46+
## Handler de errores HTTP
47+
48+
`Echo#HTTPErrorHandler` registra un handler de errores HTTP personalizado.
49+
50+
[Aprende más](/es/guide/error-handling/)
51+
52+
## Callback de ruta
53+
54+
`Echo#OnAddRoute` registra un callback que se invoca cada vez que se agrega una nueva ruta al
55+
router.
56+
57+
## Extractor de IP
58+
59+
`Echo#IPExtractor` controla cómo se determina la dirección IP real del cliente. Para
60+
obtenerla de forma fiable y segura, tu aplicación debe conocer toda su infraestructura.
61+
62+
[Aprende más](/es/guide/ip-address/)

0 commit comments

Comments
 (0)