Introducción
Giraffe es un framework para construir aplicaciones web en F#. Se basa en ASP.NET Core y proporciona una forma funcional de definir rutas y manejar solicitudes HTTP. En este módulo, aprenderemos a configurar un proyecto Giraffe, definir rutas, manejar solicitudes y respuestas, y trabajar con middleware.
Contenido
Configuración del Proyecto
Paso 1: Crear un Nuevo Proyecto
Para comenzar, necesitamos crear un nuevo proyecto de consola en F# y agregar las dependencias necesarias para Giraffe.
dotnet new console -lang F# -o GiraffeApp cd GiraffeApp dotnet add package Giraffe dotnet add package Microsoft.AspNetCore.App
Paso 2: Configurar el Proyecto
Edita el archivo Program.fs
para configurar el servidor web básico.
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!" ] let configureApp (app: IApplicationBuilder) = app.UseGiraffe webApp let configureServices (services: IServiceCollection) = services.AddGiraffe() |> ignore [<EntryPoint>] let main _ = Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(fun webHostBuilder -> webHostBuilder .Configure(configureApp) .ConfigureServices(configureServices) |> ignore) .Build() .Run() 0
Explicación del Código
webApp
: Define una aplicación web simple que responde con "Hello, World!" en la ruta raíz.configureApp
: Configura la aplicación para usar Giraffe.configureServices
: Agrega los servicios necesarios para Giraffe.main
: Configura y ejecuta el servidor web.
Definición de Rutas
Giraffe permite definir rutas de manera funcional. Aquí hay algunos ejemplos básicos:
let webApp = choose [ route "/" >=> text "Hello, World!" route "/about" >=> text "About Page" routef "/hello/%s" (fun name -> text (sprintf "Hello, %s!" name)) ]
Explicación del Código
route "/about"
: Define una ruta que responde con "About Page".routef "/hello/%s"
: Define una ruta con un parámetro que responde con un saludo personalizado.
Manejo de Solicitudes y Respuestas
Podemos manejar solicitudes y respuestas de manera más compleja utilizando funciones de Giraffe.
let handleJsonRequest (next: HttpFunc) (ctx: HttpContext) = task { let! body = ctx.ReadBodyFromRequestAsync() return! json body next ctx } let webApp = choose [ route "/json" >=> handleJsonRequest ]
Explicación del Código
handleJsonRequest
: Lee el cuerpo de la solicitud y lo devuelve como JSON.route "/json"
: Define una ruta que utilizahandleJsonRequest
para manejar la solicitud.
Uso de Middleware
Giraffe permite el uso de middleware para manejar tareas comunes como la autenticación, el registro y la manipulación de solicitudes/respuestas.
let logRequest (next: HttpFunc) (ctx: HttpContext) = task { printfn "Request: %s" ctx.Request.Path return! next ctx } let webApp = choose [ route "/" >=> logRequest >=> text "Hello, World!" ]
Explicación del Código
logRequest
: Middleware que registra la ruta de la solicitud.route "/" >=> logRequest >=> text "Hello, World!"
: Aplica el middlewarelogRequest
antes de responder con "Hello, World!".
Ejercicio Práctico
Ejercicio
- Crea una nueva ruta
/greet/%s
que acepte un nombre como parámetro y responda con un saludo personalizado. - Agrega middleware que registre el método HTTP de cada solicitud.
Solución
let logMethod (next: HttpFunc) (ctx: HttpContext) = task { printfn "Method: %s" ctx.Request.Method return! next ctx } let webApp = choose [ route "/" >=> logMethod >=> text "Hello, World!" routef "/greet/%s" (fun name -> logMethod >=> text (sprintf "Hello, %s!" name)) ]
Explicación del Código
logMethod
: Middleware que registra el método HTTP de la solicitud.routef "/greet/%s"
: Define una ruta con un parámetro que utilizalogMethod
y responde con un saludo personalizado.
Conclusión
En este módulo, hemos aprendido a configurar un proyecto Giraffe, definir rutas, manejar solicitudes y respuestas, y utilizar middleware. Giraffe proporciona una forma funcional y poderosa de construir aplicaciones web en F#. En el próximo módulo, exploraremos cómo crear aplicaciones de escritorio con Avalonia.
Curso de Programación en F#
Módulo 1: Introducción a F#
Módulo 2: Conceptos Básicos
- Tipos de Datos y Variables
- Funciones e Inmutabilidad
- Coincidencia de Patrones
- Colecciones: Listas, Arreglos y Secuencias
Módulo 3: Programación Funcional
- Funciones de Orden Superior
- Recursión
- Encadenamiento y Composición
- Aplicación Parcial y Currificación
Módulo 4: Estructuras de Datos Avanzadas
Módulo 5: Programación Orientada a Objetos en F#
- Clases y Objetos
- Herencia e Interfaces
- Mezclando Programación Funcional y Orientada a Objetos
- Módulos y Espacios de Nombres
Módulo 6: Programación Asíncrona y Paralela
- Flujos de Trabajo Asíncronos
- Biblioteca de Tareas Paralelas
- MailboxProcessor y Agentes
- Patrones de Concurrencia
Módulo 7: Acceso y Manipulación de Datos
Módulo 8: Pruebas y Depuración
- Pruebas Unitarias con NUnit
- Pruebas Basadas en Propiedades con FsCheck
- Técnicas de Depuración
- Perfilado de Rendimiento