En aquest tema, aprendrem com gestionar les rutes en una aplicació web escrita en Go. L'enrutament és una part fonamental de qualsevol aplicació web, ja que permet definir com es gestionen les diferents sol·licituds HTTP que arriben al servidor.
Objectius
- Entendre què és l'enrutament i per què és important.
- Aprendre a definir rutes bàsiques en Go.
- Utilitzar un paquet de tercers per a l'enrutament avançat.
- Gestionar paràmetres en les rutes.
- Implementar middleware per a les rutes.
Què és l'Enrutament?
L'enrutament és el procés de mapejar les sol·licituds HTTP a funcions específiques que gestionen aquestes sol·licituds. En una aplicació web, les rutes defineixen com es gestionen les sol·licituds per a diferents URL.
Definint Rutes Bàsiques
Comencem amb un exemple senzill d'enrutament utilitzant el paquet net/http
de la biblioteca estàndard de Go.
package main import ( "fmt" "net/http" ) func homeHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Benvingut a la pàgina principal!") } func aboutHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Aquesta és la pàgina sobre nosaltres.") } func main() { http.HandleFunc("/", homeHandler) http.HandleFunc("/about", aboutHandler) http.ListenAndServe(":8080", nil) }
Explicació del Codi
- Importació de Paquets: Importem els paquets necessaris (
fmt
inet/http
). - Definició de Funcions de Gestió: Definim dues funcions (
homeHandler
iaboutHandler
) que gestionen les sol·licituds per a les rutes/
i/about
, respectivament. - Mapeig de Rutes: Utilitzem
http.HandleFunc
per mapar les rutes a les funcions de gestió. - Inici del Servidor: Utilitzem
http.ListenAndServe
per iniciar el servidor alocalhost
en el port8080
.
Utilitzant un Paquet de Tercers: gorilla/mux
Per a una gestió d'enrutament més avançada, podem utilitzar el paquet gorilla/mux
.
Instal·lació
Per instal·lar gorilla/mux
, executa:
Exemple amb gorilla/mux
package main import ( "fmt" "net/http" "github.com/gorilla/mux" ) func homeHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Benvingut a la pàgina principal!") } func aboutHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Aquesta és la pàgina sobre nosaltres.") } func main() { r := mux.NewRouter() r.HandleFunc("/", homeHandler) r.HandleFunc("/about", aboutHandler) http.ListenAndServe(":8080", r) }
Explicació del Codi
- Importació de Paquets: A més dels paquets
fmt
inet/http
, importemgithub.com/gorilla/mux
. - Creació del Router: Utilitzem
mux.NewRouter
per crear un nou router. - Mapeig de Rutes: Utilitzem
r.HandleFunc
per mapar les rutes a les funcions de gestió. - Inici del Servidor: Utilitzem
http.ListenAndServe
per iniciar el servidor, passant el router com a segon argument.
Gestionant Paràmetres en les Rutes
Amb gorilla/mux
, podem gestionar paràmetres en les rutes de manera senzilla.
Exemple amb Paràmetres
package main import ( "fmt" "net/http" "github.com/gorilla/mux" ) func articleHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) articleID := vars["id"] fmt.Fprintf(w, "Estàs veient l'article amb ID: %s", articleID) } func main() { r := mux.NewRouter() r.HandleFunc("/article/{id}", articleHandler) http.ListenAndServe(":8080", r) }
Explicació del Codi
- Funció de Gestió amb Paràmetres: La funció
articleHandler
utilitzamux.Vars
per obtenir els paràmetres de la ruta. - Definició de la Ruta amb Paràmetres: Utilitzem
{id}
per definir un paràmetre en la ruta/article/{id}
.
Implementant Middleware
El middleware és una funció que s'executa abans que la funció de gestió de la ruta. Pot ser utilitzat per a tasques com l'autenticació, el registre, etc.
Exemple de Middleware
package main import ( "fmt" "net/http" "github.com/gorilla/mux" ) func loggingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Println("Sol·licitud rebuda:", r.Method, r.URL) next.ServeHTTP(w, r) }) } func homeHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Benvingut a la pàgina principal!") } func main() { r := mux.NewRouter() r.Use(loggingMiddleware) r.HandleFunc("/", homeHandler) http.ListenAndServe(":8080", r) }
Explicació del Codi
- Funció de Middleware: La funció
loggingMiddleware
registra la sol·licitud i després cridanext.ServeHTTP
per passar la sol·licitud a la següent funció de gestió. - Aplicació del Middleware: Utilitzem
r.Use
per aplicar el middleware al router.
Exercicis Pràctics
-
Exercici 1: Crea una aplicació web que tingui les següents rutes:
/
: Mostra un missatge de benvinguda./contact
: Mostra informació de contacte./product/{id}
: Mostra informació sobre un producte específic basat en l'ID.
-
Exercici 2: Implementa un middleware que registri el temps que triga a processar cada sol·licitud.
Solucions
Solució Exercici 1
package main import ( "fmt" "net/http" "github.com/gorilla/mux" ) func homeHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Benvingut a la pàgina principal!") } func contactHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Contacta'ns a: [email protected]") } func productHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) productID := vars["id"] fmt.Fprintf(w, "Estàs veient el producte amb ID: %s", productID) } func main() { r := mux.NewRouter() r.HandleFunc("/", homeHandler) r.HandleFunc("/contact", contactHandler) r.HandleFunc("/product/{id}", productHandler) http.ListenAndServe(":8080", r) }
Solució Exercici 2
package main import ( "fmt" "net/http" "time" "github.com/gorilla/mux" ) func timingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() next.ServeHTTP(w, r) duration := time.Since(start) fmt.Println("Temps de processament:", duration) }) } func homeHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Benvingut a la pàgina principal!") } func main() { r := mux.NewRouter() r.Use(timingMiddleware) r.HandleFunc("/", homeHandler) http.ListenAndServe(":8080", r) }
Conclusió
En aquesta secció, hem après els conceptes bàsics de l'enrutament en Go, com definir rutes bàsiques, utilitzar un paquet de tercers per a l'enrutament avançat, gestionar paràmetres en les rutes i implementar middleware. Amb aquests coneixements, estàs preparat per gestionar les rutes de la teva aplicació web de manera eficient i organitzada.
Curs de Programació en Go
Mòdul 1: Introducció a Go
- Introducció a Go
- Configuració de l'Entorn Go
- El Teu Primer Programa en Go
- Sintaxi i Estructura Bàsiques
Mòdul 2: Conceptes Bàsics
Mòdul 3: Estructures de Dades Avançades
Mòdul 4: Gestió d'Errors
Mòdul 5: Concurrència
Mòdul 6: Temes Avançats
Mòdul 7: Desenvolupament Web amb Go
Mòdul 8: Treballant amb Bases de Dades
Mòdul 9: Desplegament i Manteniment
- Construcció i Desplegament d'Aplicacions Go
- Registre
- Monitorització i Optimització del Rendiment
- Millors Pràctiques de Seguretat