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 utiliza handleJsonRequest 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 middleware logRequest antes de responder con "Hello, World!".

Ejercicio Práctico

Ejercicio

  1. Crea una nueva ruta /greet/%s que acepte un nombre como parámetro y responda con un saludo personalizado.
  2. 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 utiliza logMethod 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

Módulo 3: Programación Funcional

Módulo 4: Estructuras de Datos Avanzadas

Módulo 5: Programación Orientada a Objetos en F#

Módulo 6: Programación Asíncrona y Paralela

Módulo 7: Acceso y Manipulación de Datos

Módulo 8: Pruebas y Depuración

Módulo 9: Temas Avanzados

Módulo 10: Aplicaciones Prácticas

© Copyright 2024. Todos los derechos reservados