Skip to content

Commit 7709bc1

Browse files
committed
docs(i18n): guide (pt-br)
1 parent ae8d208 commit 7709bc1

14 files changed

Lines changed: 1749 additions & 0 deletions
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
---
2+
title: Binding
3+
description: Analise dados de request em structs Go tipadas a partir de path, query, header e body.
4+
sidebar:
5+
order: 5
6+
---
7+
8+
Analisar dados de request é uma parte crucial de uma aplicação web. No Echo isso se chama
9+
_binding_, e ele pode ler de quatro partes de um request HTTP:
10+
11+
- Parâmetros de caminho da URL
12+
- Parâmetros de query da URL
13+
- Headers
14+
- Body do request
15+
16+
## Binding com tags de struct
17+
18+
Defina uma struct com tags que especificam a fonte e a chave dos dados, então chame `c.Bind()`
19+
com um ponteiro para ela. Aqui o parâmetro de query `id` faz binding para o 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+
### Fontes de dados
34+
35+
| Tag | Fonte |
36+
| -------- | ----- |
37+
| `query` | Parâmetro de query |
38+
| `param` | Parâmetro de caminho |
39+
| `header` | Valor de header |
40+
| `form` | Dados de formulário (query + body) |
41+
| `json` | Body do request (`encoding/json`) |
42+
| `xml` | Body do request (`encoding/xml`) |
43+
44+
Campos de path, query, header e form exigem uma **tag explícita**. JSON e XML usam
45+
o nome do campo da struct quando a tag é omitida, igual à biblioteca padrão.
46+
47+
### Tipos de conteúdo do body
48+
49+
Ao decodificar o body do request, o header `Content-Type` seleciona o decoder:
50+
51+
- `application/json`
52+
- `application/xml`
53+
- `application/x-www-form-urlencoded`
54+
55+
### Múltiplas fontes e precedência
56+
57+
Um campo pode declarar várias fontes. Os dados fazem binding nesta ordem, cada etapa
58+
sobrescrevendo a anterior:
59+
60+
1. Parâmetros de caminho
61+
2. Parâmetros de query (somente GET / DELETE)
62+
3. Body do 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 direto de uma fonte
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+
Headers **não** são incluídos por `c.Bind()`. Faça binding deles diretamente com `echo.BindHeaders`.
81+
:::
82+
83+
:::caution[Segurança]
84+
Não faça binding diretamente em structs de negócio. Se uma struct vinculada expuser um campo `IsAdmin bool`,
85+
um body de request `{"IsAdmin": true}` o definiria. Use um DTO dedicado e faça o mapeamento
86+
explicitamente:
87+
:::
88+
89+
```go
90+
type UserDTO struct {
91+
Name string `json:"name" form:"name" query:"name"`
92+
Email string `json:"email" form:"email" query:"email"`
93+
}
94+
95+
e.POST("/users", func(c *echo.Context) error {
96+
var dto UserDTO
97+
if err := c.Bind(&dto); err != nil {
98+
return c.String(http.StatusBadRequest, "bad request")
99+
}
100+
user := User{Name: dto.Name, Email: dto.Email, IsAdmin: false}
101+
executeSomeBusinessLogic(user)
102+
return c.JSON(http.StatusOK, user)
103+
})
104+
```
105+
106+
## Binding fluente
107+
108+
Para binding explícito e type-safe de uma única fonte, use os binders fluentes. Eles
109+
encadeiam configuração e execução, coletando erros:
110+
111+
```go
112+
// /api/search?active=true&id=1&id=2&id=3&length=25
113+
var opts struct {
114+
IDs []int64
115+
Active bool
116+
}
117+
length := int64(50)
118+
119+
err := echo.QueryParamsBinder(c).
120+
Int64("length", &length).
121+
Int64s("id", &opts.IDs).
122+
Bool("active", &opts.Active).
123+
BindError() // first error, if any
124+
```
125+
126+
Binders disponíveis: `echo.QueryParamsBinder(c)`, `echo.PathValuesBinder(c)`,
127+
`echo.FormFieldBinder(c)`. Termine uma cadeia com `BindError()` (primeiro erro) ou
128+
`BindErrors()` (todos os erros). `FailFast(false)` executa a cadeia inteira; ele vem ativado por padrão.
129+
130+
Cada tipo suportado oferece métodos `Type(...)`, `MustType(...)`, `Types(...)` (slices) e
131+
`MustTypes(...)` — por exemplo, `Int64`, `MustInt64`, `Int64s`. Use
132+
`BindWithDelimiter("id", &dest, ",")` para separar valores unidos por vírgula.
133+
134+
## Binder customizado
135+
136+
Registre um binder customizado via `Echo#Binder`:
137+
138+
```go
139+
type CustomBinder struct{}
140+
141+
func (cb *CustomBinder) Bind(c *echo.Context, i any) error {
142+
db := new(echo.DefaultBinder)
143+
if err := db.Bind(c, i); err != echo.ErrUnsupportedMediaType {
144+
return err
145+
}
146+
// custom logic here
147+
return nil
148+
}
149+
150+
e.Binder = &CustomBinder{}
151+
```
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
---
2+
title: Context
3+
description: O objeto por request que carrega request, response, parâmetros e helpers.
4+
sidebar:
5+
order: 4
6+
---
7+
8+
`echo.Context` representa o contexto do request HTTP atual. Um ponteiro para ele
9+
(`*echo.Context`) é passado para todo handler e middleware, carregando o request e a
10+
response, parâmetros de caminho, dados vinculados e helpers para criar responses.
11+
12+
```go
13+
func handler(c *echo.Context) error {
14+
// ...
15+
return nil
16+
}
17+
```
18+
19+
## Ler 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+
Há helpers `*Or` correspondentes que retornam um padrão quando um valor está ausente —
30+
`c.ParamOr("id", "0")`, `c.QueryParamOr("page", "1")`, `c.FormValueOr(...)`.
31+
32+
## Escrever 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+
## Arquivos
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+
## Armazenamento por request
55+
56+
Compartilhe dados entre middleware e handlers com `Get`/`Set`:
57+
58+
```go
59+
c.Set("user", u)
60+
u, _ := c.Get("user").(*User)
61+
```
62+
63+
Acesso tipado está disponível por meio dos helpers de generics:
64+
65+
```go
66+
u, err := echo.ContextGet[*User](c, "user")
67+
```
68+
69+
## Binding e validação
70+
71+
`c.Bind()` analisa dados do request em uma struct; veja [Binding](/pt-br/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: Crie, leia e liste HTTP cookies usando o tipo padrão http.Cookie.
4+
sidebar:
5+
order: 11
6+
---
7+
8+
Um cookie é um pequeno pedaço de dados que um servidor envia ao navegador, que o navegador
9+
armazena e envia de volta em requests subsequentes. Cookies permitem que sites lembrem
10+
informações com estado, como carrinho de compras, estado de autenticação ou valores de formulário
11+
inseridos anteriormente.
12+
13+
Echo usa o tipo padrão `http.Cookie` do Go para adicionar e recuperar cookies do
14+
`echo.Context` em um handler.
15+
16+
## Atributos de cookie
17+
18+
| Atributo | Opcional |
19+
| ---------- | -------- |
20+
| `Name` | Não |
21+
| `Value` | Não |
22+
| `Path` | Sim |
23+
| `Domain` | Sim |
24+
| `Expires` | Sim |
25+
| `Secure` | Sim |
26+
| `HttpOnly` | Sim |
27+
28+
## Criar um 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+
- Crie o cookie com `new(http.Cookie)`.
42+
- Defina atributos nos campos de `http.Cookie`.
43+
- Chame `c.SetCookie(cookie)` para adicionar um header `Set-Cookie` à response.
44+
45+
## Ler um 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+
- Leia um cookie por nome com `c.Cookie("username")`.
60+
- Acesse seus atributos por meio dos campos de `http.Cookie`.
61+
62+
## Ler todos os 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: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
---
2+
title: Customização
3+
description: Customize logger, validator, binder, renderer, serializer e tratamento de erros do Echo.
4+
sidebar:
5+
order: 12
6+
---
7+
8+
Echo expõe um conjunto de campos na instância `Echo` que permite substituir o comportamento
9+
embutido pelas suas próprias implementações.
10+
11+
## Logging
12+
13+
`Echo#Logger` escreve logs estruturados. O handler padrão emite JSON para `os.Stdout`.
14+
15+
### Logger customizado
16+
17+
O logger é um `*slog.Logger`, então você pode registrar qualquer handler `slog`:
18+
19+
```go
20+
e.Logger = slog.New(slog.NewJSONHandler(os.Stdout, nil))
21+
```
22+
23+
## Validator
24+
25+
`Echo#Validator` registra um validador para validação de payloads de request.
26+
27+
[Saiba mais](/pt-br/guide/request/#validate-data)
28+
29+
## Binder customizado
30+
31+
`Echo#Binder` registra um binder customizado para binding de payloads de request.
32+
33+
[Saiba mais](/pt-br/guide/binding/#custom-binder)
34+
35+
## Serializer JSON customizado
36+
37+
`Echo#JSONSerializer` registra um serializer JSON customizado. Veja `DefaultJSONSerializer`
38+
em [json.go](https://github.com/labstack/echo/blob/master/json.go).
39+
40+
## Renderer
41+
42+
`Echo#Renderer` registra um renderer para renderização de templates.
43+
44+
[Saiba mais](/pt-br/guide/templates/)
45+
46+
## Handler de erro HTTP
47+
48+
`Echo#HTTPErrorHandler` registra um handler de erro HTTP customizado.
49+
50+
[Saiba mais](/pt-br/guide/error-handling/)
51+
52+
## Callback de rota
53+
54+
`Echo#OnAddRoute` registra um callback chamado sempre que uma nova rota é adicionada ao
55+
router.
56+
57+
## Extrator de IP
58+
59+
`Echo#IPExtractor` controla como o endereço IP real do cliente é determinado. Para
60+
recuperá-lo de forma confiável e segura, sua aplicação precisa conhecer toda a sua
61+
infraestrutura.
62+
63+
[Saiba mais](/pt-br/guide/ip-address/)

0 commit comments

Comments
 (0)