Crear un servidor HTTP en Golang desde cero

Author picture Por fulldump.net / 75 views / 2025-03-10
#buildinpublic #SeniorGo Servidor HTTP en golang desde cero

Golang ya viene con un servidor HTTP robusto, potente y preparado para producción. Además es muy fácil de usar y no por ello deja de ser versátil y configurable hasta el más mínimo detalle.

El paquete http contiene un objeto Server con todo lo que necesitamos. Lo mínimo imprescindible que necesita para arrancar son los atributos Addr y Handler.

Addr

Addr es la dirección en la que va a escuchar, es un string con la forma <ip>:<puerto>. Por ejemplo, si queremos recibir peticiones de cualquier ordenador de la red por el puerto 8080, se le puede poner :8080 o 0.0.0.0:8080. Si estuviéramos desarrollando podríamos utilizar 127.0.0.1:8080 para que solamente nuestro equipo pueda acceder (muy útil en los Mac para evitar que nos salte el aviso del firewall constantemente).

Handler

Handler es una función a la que se nos invocará cada vez que el servidor reciba una petición HTTP. Esta función dispone de una ResponseWriter para enviar nuestra respuesta y de una Request para leer la petición del cliente.

En el siguiente ejemplo escribimos un log con el método HTTP y la URL y luego enviamos como respuesta un "Hello World!!".

package main import ( "log" "net/http" ) func main() { s := &http.Server{ Addr: ":8080", Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Println(r.Method, r.URL) w.Write([]byte("Hello World!!")) }), } err := s.ListenAndServe() if err != nil { log.Fatal(err) } }

Si al arrancar el servidor todo ha ido bien, la ejecución se detendrá en la llamada a ListenAndServe porque es bloqueante, y todas las peticiones HTTP que lleguen, se atenderán con la función handler que hemos definido.

En este ejemplo siempre devolvemos la misma respuesta in importar la URL que nos llegue.

Sirviendo más páginas

Para servir más páginas, por ejemplo la de inicio y la de login, debemos añadir manualmente condiciones.

s := &http.Server{ Addr: ":8080", Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Println(r.Method, r.URL) if r.URL.Path == "/" { w.Write([]byte("<h1>Inicio</h1>")) return } if r.URL.Path == "/login" { w.Write([]byte("<h1>Login</h1>")) return } // ... }), }

De esta forma obtendremos la página de login al acceder a http://localhost:8080/login y la página de inicio en http://localhost:8080/

Como ya habrás adivinado, este código es frágil y poco mantenible pero por suerte existen los routers HTTP, también llamados Mux, para alegrarnos el día.

¡Acompáñanos!

Sigue el proyecto en Discord SeniorGo - Latam.

Únete al proyecto en GitHub.

Mira el vídeo completo en YouTube.