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()
0Explicació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 utilizahandleJsonRequestpara 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 middlewarelogRequestantes de responder con "Hello, World!".
Ejercicio Práctico
Ejercicio
- Crea una nueva ruta
/greet/%sque 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 utilizalogMethody 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
