Skip to content

Commit 2a833e8

Browse files
committed
update bio, add post
1 parent dcea603 commit 2a833e8

File tree

3 files changed

+139
-7
lines changed

3 files changed

+139
-7
lines changed

content/biografia.md

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,8 @@ date: 2021-04-03T13:19:25-06:00
44
draft: false
55
---
66

7-
**Gophers LATAM** es un esfuerzo conjunto por hacer una comunidad de programadores **Golang** en Español-Latino.
7+
**Gophers LATAM** surgió como una iniciativa colaborativa destinada a construir una comunidad de programadores Go en español para toda América Latina. Iniciamos con el canal de YouTube de [Tomás Lingotti](https://www.youtube.com/c/tomaslingotti) y adoptamos la idea de un servidor de [Discord](https://discord.gg/AEarh2kSvn). Posteriormente, creamos un nuevo canal oficial de la comunidad en YouTube bajo el nombre ["Gophers LATAM"](https://www.youtube.com/@gophers-latam) y expandimos nuestra presencia en espacios comunitarios en Twitter y LinkedIn. Además, hemos colaborado activamente con otras comunidades de Go en la región. Estamos presentes de manera activa en medios sociales como [Twitter](https://x.com/gophers_latam), [LinkedIn](https://www.linkedin.com/groups/12007379/), [Facebook](https://www.facebook.com/groups/gophers.mx) y [otros](https://gophers-latam.github.io/contacto/).
88

9-
Los inicios son desde el canal de *YouTube* de [**Tomás Lingotti**](https://www.youtube.com/c/tomaslingotti), luego se adopto la idea del [**Discord**](https://discord.gg/AEarh2kSvn) el cual ha sido impulsado desde el mismo canal y en otros canales de YouTube, tales como el de [**Golandia**](https://www.youtube.com/c/Golandia). Compartido en otros medios como **Facebook**, **Twitter** y **Linkedin**. Y con apoyo desde los inicios de [**zeroidentidad**](https://zeroidentidad.wordpress.com).
9+
Desde nuestros inicios en octubre de 2020, hemos estado atrayendo nuevos miembros clave que se han incorporado a nuestra misión
1010

11-
Otra forma en la que se ha adoptado hacer presencia es en [**Github**](https://github.com/gophers-latam).
12-
13-
-- Todo lo mencionado surgió desde octubre del 2020.
14-
15-
![Gornio](/assets/awesome.png)
11+
![img](/assets/awesome.png)
Loading
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
---
2+
title: "Guía de enrutamiento http estándar Go 1.22+"
3+
date: 2024-07-09T11:48:56-06:00
4+
draft: false
5+
author: zeroidentidad
6+
year: "2024"
7+
month: "2024/07"
8+
categories:
9+
- Tutorial
10+
- Ejemplos
11+
tags:
12+
- routing
13+
- golang
14+
keywords:
15+
- apis
16+
- rest
17+
- guia
18+
disableComments: false
19+
---
20+
21+
{{<postimage "images/servmux.png" "new servmux">}}
22+
23+
Considerando la promesa de retrocompatibilidad esta guía o tutorial se estima sirva de referencia para la era de versiones de Go 1.22+
24+
25+
<!--more-->
26+
27+
Desde Go 1.22, **ServeMux** se adaptó para permitir declaraciones de métodos dentro de la ruta. A continuación se ejemplifica de manera resumida el uso de los verbos de métodos http más esenciales o comunes.
28+
29+
```go
30+
package main
31+
32+
import (
33+
"encoding/json"
34+
"fmt"
35+
"log"
36+
"net/http"
37+
)
38+
39+
type greeting struct {
40+
Greeting string `json:"greeting"`
41+
}
42+
43+
func main() {
44+
mux := http.NewServeMux()
45+
46+
mux.HandleFunc("GET /hello", func(w http.ResponseWriter, r *http.Request) {
47+
w.Write([]byte(`Hello`))
48+
})
49+
50+
mux.HandleFunc("POST /greetings", func(w http.ResponseWriter, r *http.Request) {
51+
decoder := json.NewDecoder(r.Body)
52+
var g greeting
53+
_ = decoder.Decode(&g)
54+
w.Write([]byte(g.Greeting))
55+
})
56+
57+
mux.HandleFunc("PUT /greetings/{id}", func(w http.ResponseWriter, r *http.Request) {
58+
id := r.PathValue("id")
59+
fmt.Fprintf(w, "Update greeting with id: %s", id)
60+
})
61+
62+
mux.HandleFunc("DELETE /greetings/{id}", func(w http.ResponseWriter, r *http.Request) {
63+
id := r.PathValue("id")
64+
fmt.Fprintf(w, "Delete order with id: %s", id)
65+
})
66+
67+
if err := http.ListenAndServe(":3000", mux); err != nil {
68+
log.Panic(err)
69+
}
70+
}
71+
```
72+
`[METHOD ][HOST]/[PATH]` - solo se acepta UN método, no se puede hacer `"GET POST /hello"`.
73+
74+
## Wildcards en patrones de ruta
75+
76+
Las nuevas reglas de enrutamiento permiten aceptar parámetros en la ruta. Los parámetros de ruta no son raros; el hecho de que no existía soporte para ellos habia sido una de las principales razones por las que muchas personas han usado Gorilla u otras librerias de enrutamiento.
77+
78+
Un parámetro de ruta es una parte o sección de la URL que espera un valor en la solicitud; por ejemplo, digamos que se permitirá que los usuarios agreguen un nombre para saludar. La solicitud sería entonces `/hello/$NAME`.
79+
80+
El nuevo **ServeMux** permite especificar parámetros con un nombre envolviéndolos en `{}`. Entonces se puede agregar un parámetro para el nombre haciendo que la ruta sea `/hello/{name}`.
81+
82+
Para poder capturar el parámetro, la solicitud HTTP contiene una función llamada `PathValue`. Esta función acepta el nombre del parámetro a buscar.
83+
84+
Ejemplo:
85+
86+
```go
87+
mux := http.NewServeMux()
88+
89+
mux.HandleFunc("GET /hello/{name}", func(w http.ResponseWriter, r *http.Request) {
90+
name := r.PathValue("name")
91+
w.Write([]byte(fmt.Sprintf("Hello %s!", name)))
92+
})
93+
```
94+
No se necesita verificar que `name` esté presente; si se intenta enviar una solicitud sin el parámetro, se verá que devuelve [HTTP 404] Not found.
95+
96+
Puede haber casos de uso en los que sea necesario permitir que se establezcan rutas dinámicas y seguir utilizando parámetros. Para resolver eso, se puede terminar `{}` con `...` (tres puntos) que harán que el patrón coincida con cualquier segmento después del parámetro.
97+
98+
Ejemplo:
99+
100+
```go
101+
mux.HandleFunc("GET /hello/{name...}", func(w http.ResponseWriter, r *http.Request) {
102+
name := r.PathValue("name")
103+
w.Write([]byte(fmt.Sprintf("Hello %s!", name)))
104+
})
105+
```
106+
Esto permitirá pasar una solicitud dinámica con más segmentos al parámetro. Por ejemplo, `/hello/zero/123`
107+
108+
### Hacer coincidir patrones exactos con terminación de slashes
109+
110+
HTTP mux hace coincidir con cualquier ruta que tenga el prefijo correcto. Esto significa que si la ruta es `hello/` entonces cualquier solicitud a rutas que comiencen con `hello/` coincidirá y se considera válida. La clave aquí es `/` al final de la ruta, que siempre le ha dicho a ServeMux que coincida con cualquier prefijo posterior.
111+
112+
¿Qué pasa si solo se quiere permitir coincidencias EXACTAS? Bueno, esto es usando `{$}` al final de la ruta. Esto le indicará al Servemux que solo enrute coincidencias exactas. Esto tiene que estar al final de la ruta.
113+
114+
Ejemplo:
115+
116+
```go
117+
mux.HandleFunc("GET /hello/{$}", func(w http.ResponseWriter, r *http.Request) {
118+
w.Write([]byte(`Hello`))
119+
})
120+
```
121+
Esto ahora solo permite enviar solicitudes que sean exactamente `hello/`
122+
123+
### Resolución de ruta y precedencia
124+
125+
Con las nuevas reglas de ServeMux, ahora una solicitud puede coincidir con DOS rutas. Esto se soluciona teniendo siempre ordenada hasta la ruta MÁS ESPECÍFICA.
126+
127+
Prioridad por detalle de especificación:
128+
129+
```go
130+
http.HandleFunc("/hello", helloHandler) // Menos específica
131+
http.HandleFunc("/hello/{name}", helloHandler) // Mas específica
132+
```
133+
134+
Por último, sobre parámetros de consulta en la ruta no hay algo que destacar, el uso y funcionamiento siguen igual.
135+
136+
- Referencia: https://go.dev/blog/routing-enhancements

0 commit comments

Comments
 (0)