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
Warpper 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 response2.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.
