Cómo crear un servidor HTTP con Go

Crea un servidor HTTP básico usando Go, ideal para comenzar a trabajar con servicios web simples.

http-servidor-go

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.

Servidor HTTP en Go

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:

server.go
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.

Explicación del código

Lo que hicimos fue:

  • Usar http.HandleFunc para registrar una función que responde a todas las solicitudes que lleguen a /.
  • Esa función recibe dos parámetros: http.ResponseWriter y *http.Request. El primero nos permite escribir la respuesta; el segundo contiene los detalles de la solicitud.
  • Luego llamamos a http.ListenAndServe, que pone en marcha el servidor.

Agregando rutas personalizadas

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.

Sirviendo archivos estáticos

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.

Un ejemplo con parámetros de URL

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".

Algunas cosas a tener en cuenta

  • Go no tiene un router avanzado por defecto, pero para muchas cosas básicas no lo necesitamos.
  • Si el proyecto crece, podemos usar paquetes como gorilla/mux o chi, que agregan routing más detallado.
  • Siempre es buena idea manejar errores y validaciones, aunque aquí los dejamos fuera para simplificar.

Conclusión

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.