En este tema, aprenderemos a construir un servidor web simple en Haskell utilizando la biblioteca Warp. Este ejercicio nos permitirá aplicar muchos de los conceptos aprendidos en los módulos anteriores y nos introducirá a la programación web en Haskell.

Objetivos

  • Configurar un proyecto Haskell para construir un servidor web.
  • Entender los conceptos básicos de la biblioteca Warp.
  • Crear rutas y manejar solicitudes HTTP.
  • Responder con contenido HTML.

Requisitos Previos

  • Conocimientos básicos de Haskell.
  • Familiaridad con el sistema de tipos y funciones en Haskell.
  • Haber completado los módulos anteriores del curso.

Paso 1: Configuración del Proyecto

Primero, necesitamos configurar un nuevo proyecto Haskell. Utilizaremos stack, una herramienta de construcción para Haskell.

  1. Crear un nuevo proyecto:

    stack new simple-web-server
    cd simple-web-server
    
  2. Editar el archivo package.yaml para incluir las dependencias necesarias:

    dependencies:
    - base >= 4.7 && < 5
    - warp
    - wai
    - text
    
  3. Instalar las dependencias:

    stack build
    

Paso 2: Escribir el Código del Servidor

Vamos a crear un archivo src/Main.hs y escribir el código para nuestro servidor web.

  1. Importar las bibliotecas necesarias:

    {-# LANGUAGE OverloadedStrings #-}
    
    import Network.Wai (Application, responseLBS)
    import Network.Wai.Handler.Warp (run)
    import Network.HTTP.Types (status200)
    import Data.Text.Lazy (Text)
    import Data.Text.Lazy.Encoding (encodeUtf8)
    
  2. Definir la aplicación:

    app :: Application
    app request respond = do
        let responseText = "<h1>Hola, Mundo!</h1>"
        respond $ responseLBS status200 [("Content-Type", "text/html")] (encodeUtf8 responseText)
    
  3. Configurar el servidor para que escuche en el puerto 8080:

    main :: IO ()
    main = do
        putStrLn "Servidor escuchando en http://localhost:8080"
        run 8080 app
    

Explicación del Código

  • Importaciones:

    • Network.Wai y Network.Wai.Handler.Warp son las bibliotecas principales para manejar aplicaciones web y servidores en Haskell.
    • Network.HTTP.Types proporciona tipos y funciones para manejar HTTP.
    • Data.Text.Lazy y Data.Text.Lazy.Encoding se utilizan para manejar y codificar texto.
  • Definición de la Aplicación:

    • app es una función que toma una solicitud (request) y una función de respuesta (respond).
    • responseLBS crea una respuesta HTTP con un estado, encabezados y cuerpo.
    • status200 es el código de estado HTTP para "OK".
    • encodeUtf8 convierte el texto en una cadena de bytes UTF-8.
  • Configuración del Servidor:

    • run 8080 app inicia el servidor en el puerto 8080 y utiliza la aplicación app para manejar las solicitudes.

Ejecución del Servidor

Para ejecutar el servidor, usa el siguiente comando en la terminal:

stack run

Abre tu navegador y visita http://localhost:8080. Deberías ver "Hola, Mundo!" en la pantalla.

Ejercicio Práctico

Ejercicio 1: Añadir una Ruta Adicional

Modifica el servidor para que maneje una ruta adicional /about que responda con "Acerca de nosotros".

Solución

  1. Modificar la aplicación para manejar múltiples rutas:

    {-# LANGUAGE OverloadedStrings #-}
    
    import Network.Wai (Application, responseLBS, pathInfo)
    import Network.Wai.Handler.Warp (run)
    import Network.HTTP.Types (status200, status404)
    import Data.Text.Lazy (Text)
    import Data.Text.Lazy.Encoding (encodeUtf8)
    
    app :: Application
    app request respond = do
        let path = pathInfo request
        case path of
            [] -> respond $ responseLBS status200 [("Content-Type", "text/html")] (encodeUtf8 "<h1>Hola, Mundo!</h1>")
            ["about"] -> respond $ responseLBS status200 [("Content-Type", "text/html")] (encodeUtf8 "<h1>Acerca de nosotros</h1>")
            _ -> respond $ responseLBS status404 [("Content-Type", "text/html")] (encodeUtf8 "<h1>Página no encontrada</h1>")
    
    main :: IO ()
    main = do
        putStrLn "Servidor escuchando en http://localhost:8080"
        run 8080 app
    
  2. Explicación:

    • pathInfo extrae la ruta de la solicitud.
    • case path of se utiliza para manejar diferentes rutas.
    • Se añade una ruta adicional ["about"] que responde con "Acerca de nosotros".
    • Se maneja una ruta por defecto para páginas no encontradas con el estado status404.

Conclusión

En este tema, hemos aprendido a configurar y construir un servidor web simple en Haskell utilizando la biblioteca Warp. Hemos cubierto cómo manejar rutas y responder con contenido HTML. Este es un primer paso hacia la creación de aplicaciones web más complejas en Haskell.

En el siguiente tema, exploraremos cómo acceder a bases de datos desde Haskell, lo que nos permitirá construir aplicaciones web dinámicas y ricas en funcionalidades.

© Copyright 2024. Todos los derechos reservados