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.

  1. Configuració del Projecte

1.1. Crear un Nou Projecte

Primer, crearem un nou projecte Haskell. Pots utilitzar stack per a això:

stack new simple-web-server
cd simple-web-server

1.2. Afegir Dependències

Edita el fitxer package.yaml per afegir les dependències necessàries. Afegirem warp i wai:

dependencies:
  - base >= 4.7 && < 5
  - warp
  - wai

Després, actualitza les dependències:

stack build

  1. 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ó:

main :: IO ()
main = do
    putStrLn "Starting server on port 8080..."
    run 8080 app

2.4. Executar el Projecte

Compila i executa el projecte:

stack run

Ara, si obres un navegador web i vas a http://localhost:8080, hauràs de veure el missatge "Hello, World!".

  1. 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:

dependencies:
  - wai-route

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:

main :: IO ()
main = do
    putStrLn "Starting server on port 8080..."
    run 8080 app

  1. 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.

© Copyright 2024. Tots els drets reservats