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.
-
Crear un nuevo proyecto:
stack new simple-web-server cd simple-web-server
-
Editar el archivo
package.yaml
para incluir las dependencias necesarias:dependencies: - base >= 4.7 && < 5 - warp - wai - text
-
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.
-
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)
-
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)
-
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
yNetwork.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
yData.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ónapp
para manejar las solicitudes.
Ejecución del Servidor
Para ejecutar el servidor, usa el siguiente comando en la terminal:
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
-
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
-
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.
Curso de Programación en Haskell
Módulo 1: Introducción a Haskell
- ¿Qué es Haskell?
- Configuración del Entorno de Haskell
- Sintaxis Básica y Hola Mundo
- Haskell REPL (GHCi)