Crea un servidor HTTP básico usando Go, ideal para comenzar a trabajar con servicios web simples.
Crear un servidor HTTP en Go es muy simple simple. No es necesario instalar paquetes externos, ni configurar entornos complicados. Solo necesitamos el paquete net/http
que ya viene en la biblioteca estándar de Go.
Esto lo hace una buena opción si queremos servir contenido estático, crear una API, o simplemente aprender cómo funcionan los servidores web desde dentro.
Veamos cómo lo haríamos.
Con solo unas líneas podemos hacer que nuestro navegador responda a una URL local. Este es el código más simple que podemos escribir para lograrlo:
package main
import ( "fmt" "net/http")
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hola desde Go") })
err := http.ListenAndServe(":8080", nil) if err != nil { panic(err) }}
Para iniciar el servidor desde la línea de comandos:
go run server.go
Esto crea un servidor que escucha en el puerto 8080. Cada vez que alguien accede a la raíz (/
), respondemos con el mensaje "Hola desde Go"
.
Si vamos a http://localhost:8080/
desde el navegador, veremos la respuesta directamente.
Lo que hicimos fue:
http.HandleFunc
para registrar una función que responde a todas las solicitudes que lleguen a /
.http.ResponseWriter
y *http.Request
. El primero nos permite escribir la respuesta; el segundo contiene los detalles de la solicitud.http.ListenAndServe
, que pone en marcha el servidor.Podemos agregar más rutas simplemente repitiendo http.HandleFunc
con distintas paths:
http.HandleFunc("/saludo", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hola, esta es la ruta /saludo")})
Esto ya nos permite construir una pequeña API o servir diferentes páginas.
Si queremos servir HTML, CSS o imágenes, también es fácil:
fs := http.FileServer(http.Dir("./public"))http.Handle("/static/", http.StripPrefix("/static/", fs))
Esto sirve los archivos que tengamos en la carpeta ./public
bajo la URL /static/
.
Por ejemplo, si guardamos logo.png
en ./public
, podemos accederlo desde http://localhost:8080/static/logo.png
.
Podemos leer información de la URL usando el objeto *http.Request
. Por ejemplo:
http.HandleFunc("/saludo", func(w http.ResponseWriter, r *http.Request) { nombre := r.URL.Query().Get("nombre") if nombre == "" { nombre = "desconocido" } fmt.Fprintf(w, "Hola, %s", nombre)})
Acceder a http://localhost:8080/saludo?nombre=Michael
devolverá "Hola, Michael"
.
gorilla/mux
o chi
, que agregan routing más detallado.Crear un servidor HTTP en Go es rápido y fácil. Con solo unas pocas líneas podemos levantar un servicio funcional que responde a rutas específicas, sirve archivos y trabaja con parámetros de URL. Esto nos permite construir pequeñas herramientas, prototipos o aprender sobre HTTP sin distracciones.
Si bien hay muchas cosas más que podríamos agregar (headers, métodos específicos como POST, middlewares, etc.), lo básico ya está sobre la mesa. A partir de aquí, podemos ir sumando complejidad según lo vayamos necesitando.