Introducció

Giraffe és un framework per a la construcció d'aplicacions web en F#. Es basa en ASP.NET Core i proporciona una manera funcional de crear aplicacions web robustes i escalables. En aquest tema, aprendrem a configurar un projecte Giraffe, crear rutes, gestionar sol·licituds i respostes, i treballar amb middleware.

Contingut

Configuració del Projecte

Passos per Configurar un Projecte Giraffe

  1. Instal·lar .NET SDK: Assegura't de tenir instal·lat el .NET SDK. Pots descarregar-lo des de aquí.

  2. Crear un Nou Projecte:

    dotnet new console -n GiraffeApp
    cd GiraffeApp
    
  3. Afegir les Dependències de Giraffe:

    dotnet add package Giraffe
    dotnet add package Microsoft.AspNetCore.App
    
  4. Estructura del Projecte:

    • Program.fs: Punt d'entrada de l'aplicació.
    • Startup.fs: Configuració de serveis i middleware.

Exemple de Program.fs

open System
open Microsoft.AspNetCore.Hosting
open Microsoft.Extensions.Hosting

[<EntryPoint>]
let main args =
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(fun webBuilder ->
            webBuilder.UseStartup<Startup>() |> ignore)
        .Build()
        .Run()
    0

Exemple de Startup.fs

open Microsoft.AspNetCore.Builder
open Microsoft.AspNetCore.Hosting
open Microsoft.Extensions.DependencyInjection
open Microsoft.Extensions.Hosting
open Giraffe

let webApp =
    choose [
        route "/" >=> text "Hello, World!"
    ]

type Startup() =
    member _.ConfigureServices(services: IServiceCollection) =
        services.AddGiraffe() |> ignore

    member _.Configure(app: IApplicationBuilder, env: IWebHostEnvironment) =
        if env.IsDevelopment() then
            app.UseDeveloperExceptionPage() |> ignore
        app.UseGiraffe(webApp)

Creació de Rutes

Definició de Rutes

Les rutes en Giraffe es defineixen utilitzant el combinador choose i el combinador route.

let webApp =
    choose [
        route "/" >=> text "Hello, World!"
        route "/about" >=> text "About Page"
    ]

Rutes amb Paràmetres

let webApp =
    choose [
        route "/" >=> text "Hello, World!"
        routef "/hello/%s" (fun name -> text (sprintf "Hello, %s!" name))
    ]

Gestió de Sol·licituds i Respostes

Obtenir Dades de la Sol·licitud

let handleRequest (next: HttpFunc) (ctx: HttpContext) =
    let name = ctx.Request.Query.["name"].ToString()
    text (sprintf "Hello, %s!" name) next ctx

let webApp =
    choose [
        route "/hello" >=> handleRequest
    ]

Enviar Respostes

let webApp =
    choose [
        route "/" >=> text "Hello, World!"
        route "/json" >=> json { Name = "F#"; Age = 16 }
    ]

Treballant amb Middleware

Afegir Middleware Personalitzat

let logRequest (next: HttpFunc) (ctx: HttpContext) =
    printfn "Request: %s" ctx.Request.Path
    next ctx

let webApp =
    choose [
        route "/" >=> text "Hello, World!"
    ]

type Startup() =
    member _.ConfigureServices(services: IServiceCollection) =
        services.AddGiraffe() |> ignore

    member _.Configure(app: IApplicationBuilder, env: IWebHostEnvironment) =
        if env.IsDevelopment() then
            app.UseDeveloperExceptionPage() |> ignore
        app.Use(logRequest)
        app.UseGiraffe(webApp)

Exemple Pràctic

Aplicació Completa

open System
open Microsoft.AspNetCore.Builder
open Microsoft.AspNetCore.Hosting
open Microsoft.Extensions.DependencyInjection
open Microsoft.Extensions.Hosting
open Giraffe

let webApp =
    choose [
        route "/" >=> text "Hello, World!"
        routef "/hello/%s" (fun name -> text (sprintf "Hello, %s!" name))
        route "/json" >=> json { Name = "F#"; Age = 16 }
    ]

type Startup() =
    member _.ConfigureServices(services: IServiceCollection) =
        services.AddGiraffe() |> ignore

    member _.Configure(app: IApplicationBuilder, env: IWebHostEnvironment) =
        if env.IsDevelopment() then
            app.UseDeveloperExceptionPage() |> ignore
        app.UseGiraffe(webApp)

[<EntryPoint>]
let main args =
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(fun webBuilder ->
            webBuilder.UseStartup<Startup>() |> ignore)
        .Build()
        .Run()
    0

Exercicis

  1. Crear una Ruta Nova: Afegeix una ruta /contact que retorni un text "Contact Page".

  2. Ruta amb Paràmetres: Crea una ruta /greet/%s que prengui un nom com a paràmetre i retorni "Greetings, [nom]!".

  3. Middleware Personalitzat: Implementa un middleware que registri el temps de resposta de cada sol·licitud.

Solucions

  1. Crear una Ruta Nova:

    let webApp =
        choose [
            route "/" >=> text "Hello, World!"
            route "/contact" >=> text "Contact Page"
        ]
    
  2. Ruta amb Paràmetres:

    let webApp =
        choose [
            route "/" >=> text "Hello, World!"
            routef "/greet/%s" (fun name -> text (sprintf "Greetings, %s!" name))
        ]
    
  3. Middleware Personalitzat:

    let logResponseTime (next: HttpFunc) (ctx: HttpContext) =
        let stopwatch = System.Diagnostics.Stopwatch.StartNew()
        let! result = next ctx
        stopwatch.Stop()
        printfn "Response time: %d ms" stopwatch.ElapsedMilliseconds
        return result
    
    type Startup() =
        member _.ConfigureServices(services: IServiceCollection) =
            services.AddGiraffe() |> ignore
    
        member _.Configure(app: IApplicationBuilder, env: IWebHostEnvironment) =
            if env.IsDevelopment() then
                app.UseDeveloperExceptionPage() |> ignore
            app.Use(logResponseTime)
            app.UseGiraffe(webApp)
    

Conclusió

En aquest tema, hem après a configurar un projecte Giraffe, crear rutes, gestionar sol·licituds i respostes, i treballar amb middleware. Giraffe proporciona una manera funcional i eficient de construir aplicacions web en F#, aprofitant la potència d'ASP.NET Core. Amb aquests coneixements, estàs preparat per començar a desenvolupar aplicacions web robustes i escalables en F#.

© Copyright 2024. Tots els drets reservats