- #go
- #golang
- #http
- #web-server
Servidor web básico con Go (Golang)
Escrito por Jhon Achata el 17 de diciembre de 2022
En esta ocasión realizaremos un servidor web básico con Go (Golang), para este ejemplo usaremos los módulos que vienen por defecto con Go
Primeros pasos
Para iniciar con nuestra aplicación nos dirigimos a la carpeta donde guardaremos el proyecto, en mi caso: /home/jhon/Code/go/goserver
.
Abrimos una terminal, nos ubicamos en la carpeta y ejecutamos el comando para inicializar nuestra aplicación
Este comando creará el archivo go.mod
en la carpeta del proyecto, el archivo contiene el nombre del módulo y la versión de Go con la que generamos el módulo (para este ejemplo estaré usando la versión 1.19
de Go)
module github.com/dcyar/goserver
go 1.19
Hola mundo en Go
Bien, ahora vamos a escribir las primeras líneas de la aplicación con un clásico Hola Mundo, para esto necesitamos crear un archivo, este se llamará main.go
, dentro del archivo escribimos lo siguiente:
package main
import "fmt"
func main() { fmt.Println("Hola Mundo")}
Guardamos y nos dirigimos a la terminal, donde ejecutaremos el siguiente comando go run main.go
, esto nos devolverá el Hola Mundo en la terminal.
Listo, ya logramos imprimir el Hola Mundo en la terminal, pero esto no es lo que queremos lograr, aún nos queda algo de trabajo, así que manos a la obra.
Servidor básico con el módulo http
Primero hagamos unos cambios en el archivo main.go
, haremos uso del módulo http de Go para inicializar nuestro servidor
package main
import "fmt"// Fíjate que para importar más de un módulo se deben usar los paréntesisimport ( "fmt" "log" "net/http")
// Definimos una constante con el puerto que vamos a usarconst PORT string = ":5000"
func main() { fmt.Println("Hola Mundo") // Hacemos una nueva instancia de ServeMux // En la documentación se define a ServeMux // como un multiplexor de peticiones HTTP mux := http.NewServeMux()
fmt.Printf("Servidor ejecutándose en el puerto %s\n", PORT)
// Con http.ListenAndServe() escuchamos las peticiones // y manejamos las solicitudes del cliente // Encerramos ese llamado con log.Fatal() // para ver por consola cualquier error log.Fatal(http.ListenAndServe(PORT, mux))}
Si vamos a la terminal, cancelamos la ejecución anterior (ctrl + c
) y volvemos a ejecutar el comando go run main.go
, veremos lo siguiente:
Si vamos al navegador y escribimos http://localhost:5000
, podremos apreciar que nos devuelve un error 404, esto es por que aún no hemos definido ninguna ruta
Primera ruta de nuestra aplicación
Ahora escribamos la primera ruta de nuestra aplicación:
Justo debajo de la instancia de ServeMux
, agregamos nuestra primera ruta:
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hola Mundo")})
Vamos a la terminal y reiniciemos el servidor, si nos dirigimos al navegador podremos ver el Hola Mundo:
Ahora podemos crear tantas rutas como queramos, por ejemplo:
mux.HandleFunc("/contacto", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Desde contacto")})
Pero qué si deseamos usar algún archivo html
?
Servir archivos estáticos
Para lograrlo, hacemos uso del módulo html/template
que también viene con Go
, veamos:
import ( "fmt" "log" "net/http" "html/template" // Asegurémonos de importar el módulo)
// Escribamos la rutamux.HandleFunc("/acerca", func(w http.ResponseWriter, r *http.Request) { // Para este ejemplo el archivo "acerca.html" // se encuentra en la carpeta "views" // que esta al mismo nivel que "main.go" tmpl := template.Must(template.ParseFiles("./views/acerca.html"))
tmpl.Execute(w, nil)})
El contenido del archivo acerca.html
, tiene una estructura básica
<!DOCTYPE html><html lang="es"> <head> <meta charset="UTF-8" /> <title>Acerca</title> </head> <body> <h1>Desde la página de Acerca</h1> </body></html>
Reiniciamos el servidor y vamos al navegador, allí podremos visualizar lo siguiente: