En aquest tema, aprendrem a construir un servidor web simple utilitzant Haskell. Utilitzarem la biblioteca Warp
, que és una implementació ràpida i lleugera del protocol HTTP en Haskell. Aquest exercici ens permetrà aplicar molts dels conceptes apresos en els mòduls anteriors, com ara la gestió d'entrada i sortida, la programació funcional i la gestió d'excepcions.
Objectius
- Configurar un projecte Haskell per a un servidor web.
- Utilitzar la biblioteca
Warp
per crear un servidor HTTP. - Gestionar sol·licituds HTTP i enviar respostes.
- Implementar rutes bàsiques.
Requisits Previs
- Coneixements bàsics de Haskell.
- Familiaritat amb la gestió de paquets en Haskell (Cabal o Stack).
- Comprensió bàsica del protocol HTTP.
- Configuració del Projecte
1.1. Crear un Nou Projecte
Primer, crearem un nou projecte Haskell. Pots utilitzar stack
per a això:
1.2. Afegir Dependències
Edita el fitxer package.yaml
per afegir les dependències necessàries. Afegirem warp
i wai
:
Després, actualitza les dependències:
- Crear el Servidor Web
2.1. Importar les Biblioteques Necessàries
Crea un fitxer src/Main.hs
i importa les biblioteques necessàries:
{-# LANGUAGE OverloadedStrings #-} import Network.Wai import Network.Wai.Handler.Warp import Network.HTTP.Types (status200) import Data.ByteString.Lazy.Char8 as L8 (pack)
2.2. Definir l'Aplicació
Definim una aplicació WAI (Web Application Interface) que gestioni les sol·licituds HTTP:
app :: Application app request respond = do let response = responseLBS status200 [("Content-Type", "text/plain")] (L8.pack "Hello, World!") respond response
2.3. Executar el Servidor
Finalment, configurem el servidor per escoltar en un port específic i executar l'aplicació:
2.4. Executar el Projecte
Compila i executa el projecte:
Ara, si obres un navegador web i vas a http://localhost:8080
, hauràs de veure el missatge "Hello, World!".
- Afegir Rutes
3.1. Definir Rutes
Podem afegir més rutes per gestionar diferents camins URL. Utilitzarem la biblioteca wai-route
per facilitar la gestió de rutes:
Primer, afegim wai-route
a les dependències:
Després, actualitzem el codi per gestionar diferents rutes:
import Network.Wai.Route app :: Application app = route $ do get "/" $ text "Hello, World!" get "/about" $ text "This is a simple web server in Haskell." get "/hello/:name" $ do name <- param "name" text $ "Hello, " <> name <> "!"
3.2. Actualitzar el Main
Actualitzem la funció main
per utilitzar la nova aplicació amb rutes:
- Exercicis Pràctics
Exercici 1: Afegir una Ruta de Salutació Personalitzada
Afegiu una ruta /greet/:name
que respongui amb un missatge de salutació personalitzat.
Solució
app :: Application app = route $ do get "/" $ text "Hello, World!" get "/about" $ text "This is a simple web server in Haskell." get "/hello/:name" $ do name <- param "name" text $ "Hello, " <> name <> "!" get "/greet/:name" $ do name <- param "name" text $ "Greetings, " <> name <> "!"
Exercici 2: Afegir una Ruta per Retornar JSON
Afegiu una ruta /json
que respongui amb un objecte JSON.
Solució
import Data.Aeson (encode, object, (.=)) app :: Application app = route $ do get "/" $ text "Hello, World!" get "/about" $ text "This is a simple web server in Haskell." get "/hello/:name" $ do name <- param "name" text $ "Hello, " <> name <> "!" get "/greet/:name" $ do name <- param "name" text $ "Greetings, " <> name <> "!" get "/json" $ json $ object ["message" .= ("Hello, JSON!" :: String)]
Conclusió
En aquest tema, hem après a configurar un projecte Haskell per crear un servidor web simple utilitzant la biblioteca Warp
. Hem vist com gestionar sol·licituds HTTP, enviar respostes i definir rutes bàsiques. A més, hem practicat afegint rutes personalitzades i respostes en format JSON. Aquestes habilitats són fonamentals per desenvolupar aplicacions web més complexes en Haskell.