Crear un 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.