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:

mkdir simple-web-server
cd simple-web-server

A continuación, inicializa un nuevo módulo de Go:

go mod init simple-web-server

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 y net/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:

go run main.go

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 y http.MethodPost: Constantes que representan los métodos GET y POST.
  • http.Error: Envía una respuesta de error con el código de estado 405 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 y goodbyeHandler: Funciones manejadoras para las rutas /hello y /goodbye.
  • http.HandleFunc("/hello", helloHandler): Asocia la ruta /hello con la función helloHandler.
  • http.HandleFunc("/goodbye", goodbyeHandler): Asocia la ruta /goodbye con la función goodbyeHandler.

Ejercicio Práctico

Ejercicio

  1. Añade una nueva ruta /greet que acepte un parámetro de consulta name y responda con un saludo personalizado. Por ejemplo, si la URL es http://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 consulta name 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.

© Copyright 2024. Todos los derechos reservados