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
-
Instal·lar .NET SDK: Assegura't de tenir instal·lat el .NET SDK. Pots descarregar-lo des de aquí.
-
Crear un Nou Projecte:
dotnet new console -n GiraffeApp cd GiraffeApp
-
Afegir les Dependències de Giraffe:
dotnet add package Giraffe dotnet add package Microsoft.AspNetCore.App
-
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
.
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
-
Crear una Ruta Nova: Afegeix una ruta
/contact
que retorni un text "Contact Page". -
Ruta amb Paràmetres: Crea una ruta
/greet/%s
que prengui un nom com a paràmetre i retorni "Greetings, [nom]!". -
Middleware Personalitzat: Implementa un middleware que registri el temps de resposta de cada sol·licitud.
Solucions
-
Crear una Ruta Nova:
let webApp = choose [ route "/" >=> text "Hello, World!" route "/contact" >=> text "Contact Page" ]
-
Ruta amb Paràmetres:
let webApp = choose [ route "/" >=> text "Hello, World!" routef "/greet/%s" (fun name -> text (sprintf "Greetings, %s!" name)) ]
-
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#.
Curs de Programació en F#
Mòdul 1: Introducció a F#
Mòdul 2: Conceptes Bàsics
- Tipus de Dades i Variables
- Funcions i Immutabilitat
- Coincidència de Patrons
- Col·leccions: Llistes, Matrius i Seqüències
Mòdul 3: Programació Funcional
Mòdul 4: Estructures de Dades Avançades
Mòdul 5: Programació Orientada a Objectes en F#
- Classes i Objectes
- Herència i Interfícies
- Barreja de Programació Funcional i Orientada a Objectes
- Mòduls i Espais de Noms
Mòdul 6: Programació Asíncrona i Paral·lela
- Fluxos de Treball Asíncrons
- Biblioteca de Tasques Paral·leles
- MailboxProcessor i Agents
- Patrons de Concurrència
Mòdul 7: Accés i Manipulació de Dades
Mòdul 8: Proves i Depuració
- Proves Unitàries amb NUnit
- Proves Basades en Propietats amb FsCheck
- Tècniques de Depuració
- Perfilat de Rendiment