En este módulo, aprenderás a construir un servidor web simple utilizando Go. Este es un paso fundamental para cualquier desarrollador que desee crear aplicaciones web con Go. Vamos a cubrir los conceptos básicos y proporcionar ejemplos prácticos para que puedas seguir y construir tu propio servidor web.
Objetivos del Módulo
- Comprender los fundamentos de la creación de un servidor web en Go.
- Aprender a manejar solicitudes HTTP.
- Implementar rutas básicas para manejar diferentes endpoints.
- Enviar respuestas HTTP desde el servidor.
Requisitos Previos
Antes de comenzar, asegúrate de tener instalado Go en tu sistema y de estar familiarizado con los conceptos básicos de programación en Go.
Contenido
Configuración del Proyecto
Primero, crea un nuevo directorio para tu proyecto y navega a él desde la terminal:
A continuación, inicializa un nuevo módulo de Go:
Creación del Servidor Web
Vamos a empezar creando un archivo main.go
en el directorio del proyecto. Este archivo contendrá el código para nuestro servidor web.
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "¡Hola, Mundo!") }) fmt.Println("Servidor iniciado en el puerto 8080") if err := http.ListenAndServe(":8080", nil); err != nil { fmt.Println("Error al iniciar el servidor:", err) } }
Explicación del Código
package main
: Define el paquete principal del programa.import
: Importa los paquetes necesarios (fmt
para la salida de texto ynet/http
para manejar las solicitudes HTTP).http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {...})
: Define un manejador para la ruta raíz (/
). La función anónima maneja las solicitudes entrantes y envía una respuesta "¡Hola, Mundo!".http.ListenAndServe(":8080", nil)
: Inicia el servidor en el puerto 8080. Si ocurre un error, se imprime en la consola.
Para ejecutar el servidor, usa el siguiente comando en la terminal:
Abre tu navegador y navega a http://localhost:8080
. Deberías ver el mensaje "¡Hola, Mundo!".
Manejo de Solicitudes HTTP
Vamos a mejorar nuestro servidor para manejar diferentes tipos de solicitudes HTTP (GET, POST, etc.).
Ejemplo de Manejo de Solicitudes GET y POST
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) { if r.Method == http.MethodGet { fmt.Fprintf(w, "Método GET recibido") } else if r.Method == http.MethodPost { fmt.Fprintf(w, "Método POST recibido") } else { http.Error(w, "Método no permitido", http.StatusMethodNotAllowed) } }) fmt.Println("Servidor iniciado en el puerto 8080") if err := http.ListenAndServe(":8080", nil); err != nil { fmt.Println("Error al iniciar el servidor:", err) } }
Explicación del Código
r.Method
: Verifica el método HTTP de la solicitud entrante.http.MethodGet
yhttp.MethodPost
: Constantes que representan los métodos GET y POST.http.Error
: Envía una respuesta de error con el código de estado405 Method Not Allowed
si el método no es GET o POST.
Implementación de Rutas
Vamos a añadir más rutas para manejar diferentes endpoints.
Ejemplo de Múltiples Rutas
package main import ( "fmt" "net/http" ) func helloHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "¡Hola desde /hello!") } func goodbyeHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "¡Adiós desde /goodbye!") } func main() { http.HandleFunc("/hello", helloHandler) http.HandleFunc("/goodbye", goodbyeHandler) fmt.Println("Servidor iniciado en el puerto 8080") if err := http.ListenAndServe(":8080", nil); err != nil { fmt.Println("Error al iniciar el servidor:", err) } }
Explicación del Código
helloHandler
ygoodbyeHandler
: Funciones manejadoras para las rutas/hello
y/goodbye
.http.HandleFunc("/hello", helloHandler)
: Asocia la ruta/hello
con la funciónhelloHandler
.http.HandleFunc("/goodbye", goodbyeHandler)
: Asocia la ruta/goodbye
con la funcióngoodbyeHandler
.
Ejercicio Práctico
Ejercicio
- Añade una nueva ruta
/greet
que acepte un parámetro de consultaname
y responda con un saludo personalizado. Por ejemplo, si la URL eshttp://localhost:8080/greet?name=Juan
, la respuesta debería ser "¡Hola, Juan!".
Solución
package main import ( "fmt" "net/http" ) func greetHandler(w http.ResponseWriter, r *http.Request) { name := r.URL.Query().Get("name") if name == "" { name = "Mundo" } fmt.Fprintf(w, "¡Hola, %s!", name) } func main() { http.HandleFunc("/greet", greetHandler) fmt.Println("Servidor iniciado en el puerto 8080") if err := http.ListenAndServe(":8080", nil); err != nil { fmt.Println("Error al iniciar el servidor:", err) } }
Explicación del Código
r.URL.Query().Get("name")
: Obtiene el valor del parámetro de consultaname
de la URL.if name == "" { name = "Mundo" }
: Si no se proporciona un nombre, se usa "Mundo" como valor predeterminado.
Conclusión
En este módulo, has aprendido a construir un servidor web simple en Go. Has visto cómo manejar solicitudes HTTP, implementar rutas y enviar respuestas desde el servidor. Estos son los fundamentos que te permitirán construir aplicaciones web más complejas en el futuro.
Próximos Pasos
En el siguiente módulo, aprenderás sobre enrutamiento avanzado y cómo manejar middleware en Go para construir aplicaciones web más robustas y escalables.
Curso de Programación en Go
Módulo 1: Introducción a Go
- Introducción a Go
- Configuración del Entorno de Go
- Tu Primer Programa en Go
- Sintaxis y Estructura Básica
Módulo 2: Conceptos Básicos
Módulo 3: Estructuras de Datos Avanzadas
Módulo 4: Manejo de Errores
Módulo 5: Concurrencia
Módulo 6: Temas Avanzados
Módulo 7: Desarrollo Web con Go
Módulo 8: Trabajando con Bases de Datos
Módulo 9: Despliegue y Mantenimiento
- Construcción y Despliegue de Aplicaciones Go
- Registro de Logs
- Monitoreo y Optimización de Rendimiento
- Mejores Prácticas de Seguridad