Uso de Pavex para el desarrollo web con Rust

Hay muchos frameworks web disponibles para que los desarrolladores elijan, incluyendo más de diez frameworks web populares en el ecosistema Rust. Cada framework Rust tiene sus propias opiniones y sigue los principios y prácticas de varios desarrolladores para optimizar y garantizar que sigan métodos de desarrollo web de calidad.
En 2022, Luca Palmieri se propuso desarrollar el framework Pavex Rust con el objetivo de lograr una excelente ergonomía, alto rendimiento, usabilidad y velocidad, además del popular framework Hyper. Actualmente, Pavex se encuentra en fase beta y listo para usar, con todas estas características ya disponibles, además de otras como mejores mensajes de error.
¿Qué es Pavex?
Pavex es un nuevo framework de Rust, de próxima aparición, diseñado para ampliar el horizonte del desarrollo web en Rust. Su objetivo es ofrecer una experiencia de desarrollo más abstracta, ergonómica y de alto rendimiento.
El framework web Pavex para Rust garantiza la seguridad en tiempo de compilación y una mejor comunicación de errores, lo que reduce la curva de aprendizaje asociada a la gestión de errores en tiempo de compilación y la sobrecarga del framework. Su arquitectura se centra en minimizar el contenido de cara al usuario para ofrecer una API limpia y un enfoque intuitivo para el desarrollador.
Usando Zeplin para la entrega de diseño: ¿Cómo se compara con el modo de desarrollo de Figma?Introducción a Pavex
Dado que Pavex está basado en Rust, necesitará la cadena de herramientas de Rust; Específicamente, necesitará Rustup para instalar y administrar Rust y Cargo como su sistema de compilación y administrador de paquetes.
También necesitarás un subcomando. Puedes instalarlo con las directivas de su documentación.cargo-px
cargo
cargo-px
Necesitarás tener todas estas herramientas disponibles en tu [nombre del archivo] PATH
, así que asegúrate de hacerlo durante la instalación. Puedes ejecutar este comando para verificar la instalación.
Rustup -- versión carga -- versión carga px -- versión
A continuación, debe instalar nightly
la cadena de herramientas de Rust. Puede agregarla con este comando:
Instalación nocturna de la cadena de herramientas RustUp
Después de la instalación nightly
, agregue el componente a la compilación:rust-docs-json
Componente RustUp : Agregar cadena de herramientas nocturnas Rust - Documentación - JSON
Finalmente, debe instalar y activar la herramienta CLI de Pavex. Ejecute este comando para instalar Pavex:
curl -- proto '=https' -- tlsv1 . 2 - LsSf https://pavex.dev/releases/download/latest/pavex_cli-installer.sh | sh # powershell irm https://pavex.dev/releases/download/latest/pavex_cli-installer.ps1 | iex
Puede ejecutar este comando para verificar la instalación:
pavex -- versión
Pavex está en versión beta, por lo que debes activarlo con una clave de activación:
Las mejores soluciones de comercio electrónico headless para desarrolladores frontendPavex autoactivable
Puedes recuperar una activación del #activation
canal del servidor Discord de Pavex después de unirte a la versión beta en Pavex.dev.
Ingrese la clave de activación y luego podrá proceder a crear un nuevo proyecto Pavex con este comando:
Pavex nuevo Pavex - tutorial y CD Pavex - tutorial
Abra el nuevo proyecto Pavex en el entorno de código que prefiere. Debería ver una estructura de carpetas similar a esta:
Puede proceder a ejecutar un proyecto de demostración de Pavex con este comando:
Desarrollar una estrategia de adquisición de clientescarrera de carga px
Al ejecutar el comando, debería obtener esto como resultado, ya que el servidor se ejecuta en el puerto predeterminado 8080
:
Puedes enviar una solicitud cURL para hacer ping al servidor de la siguiente manera:
curl - v http : //localhost:8000/api/ping
Este es el resultado que debes esperar:
Necesita comprender cómo funciona un proyecto Pavex para desarrollar con el framework. El núcleo de cada proyecto Pavex es el Blueprint
tipo. Lo usará Blueprint
para definir rutas, middleware, controladores de errores y otras funciones.
Revisa el archivo de tu proyecto. Esto es lo que deberías esperar ver:pavex_tutorial/src/blueprint.rs
Blueprint
pavex_tutorial
pub fn blueprint() - Plano { let mut bp = Blueprint::new(); ApiKit::new().register(mut bp); agregar_telemetría_middleware(mut bp); pb}
La blueprint
función contiene todas las rutas, constructores y controladores de errores. Pavex requiere que la blueprint
función se ejecute.
Creando tu primera ruta Pavex
El enrutamiento con Pavex es sencillo e intuitivo en comparación con muchos otros frameworks web de Rust. Registrarás rutas, middleware, etc., en la register
función después de escribir las funciones de controlador de la siguiente manera:
//rutas/mod.rsestado de mod de pub ;pub mod hola ;usar pavex :: blueprint ::{ enrutador :: GET , Blueprint }; usar pavex :: f ; pub fn registro (bp: mut Blueprint) { bp.route (GET, "/api/ping", f! (self:: estado :: ping)); bp.route(GET, "/api/hola/:nombre", f !( self :: hola :: hola ) ); }
Arriba, registramos la función del controlador de solicitudes GET hello
con la ruta. A continuación, se explica cómo extraer y usar parámetros de ruta con Pavex:/api/hello/:name
// rutas/hola.rsutilizar pavex :: solicitud :: ruta :: PathParams ; utilizar pavex :: respuesta :: Respuesta ;#[PathParams] pub struct HelloParameters { nombre de pub : String , } pub fn hola ( params : PathParams HelloParameters ) - Respuesta { let HelloParameters { nombre } = params.0 ; Respuesta :: ok () . set_typed_body ( formato !( "Hola, { nombre}!" ) ) }
Puedes usar una estructura para modelar los objetos que esperas de una solicitud. La HelloParameters
estructura es la estructura del name
parámetro de la solicitud. La hello
función recupera el parámetro de ruta y escribe una cadena con dicho parámetro al cliente como respuesta.
Manejo de datos de solicitud con Pavex
Gestionar todo tipo de datos de solicitud con Pavex también es muy intuitivo. Puedes usar los contenedores serde
y serde_json
con Pavex para operaciones JSON. Pavex también ofrece una JsonBody
función para analizar el cuerpo de una solicitud entrante como JSON.
Aquí está la lista completa de importaciones que necesitarán para manejar los datos de solicitud JSON:
utilizar pavex :: http ::{ StatusCode , HeaderValue }; utilizar pavex :: request :: body :: JsonBody ; utilizar pavex :: respuesta :: Respuesta ; utilizar serde ::{ Serializar , Deserializar }; utilizar serde_json :: to_string ;
A continuación, se muestra una User
estructura para la operación JSON. La #[derive(Serialize, Deserialize)]
macro añade funcionalidad de serialización y deserialización mediante el serde
contenedor:
#[derive(Serializar, Deserializar)] pub struct Usuario { pub id : u32 , pub nombre : String , pub email : String , }
A continuación, se explica cómo se puede deserializar una carga JSON en la User
estructura:
pub fn create_user (cuerpo: usuario JsonBody) - Respuesta {let usuario = cuerpo.0; // La deserialización ocurre aquí let save_user = Usuario { id : 1 , .. usuario } ; // otras acciones }
Esta create_user
función es un controlador de solicitudes que gestiona las solicitudes POST para crear un nuevo usuario. Acepta datos codificados en JSON del cuerpo de la solicitud y los deserializa para recuperarlos de forma similar a una estructura. El extractor de Pavex deserializa el JSON del cuerpo de la solicitud.JsonBodyT
A continuación se explica cómo puede registrar la create_user
función del controlador en la register
función:
pub fn register(bp:mut Blueprint) { bp.route(POST, "/api/users", f!(self::json:create_user)); }
create_user
Ahora se puede acceder a la funcionalidad de la función a través de la ruta y puedes realizarle solicitudes./api/users
Respondiendo a las solicitudes
Puedes responder a las solicitudes de clientes mediante Response
el objeto de Pavex. Así es como puedes implementar una función de gestión de solicitudes GET:
utilizar pavex :: respuesta :: Respuesta ;pub fn get_user () - Respuesta { let usuario = Usuario { id : 1 , nombre : "Jane Doe" .to_string ( ), correo electrónico : " jane.doe@example.com " .to_string (), } ; // Serializar la estructura del usuario en una cadena JSON match to_string (user) { Ok (json) = json, Err (_) = return Response :: new (StatusCode :: INTERNAL_SERVER_ERROR), }; deje que mut respuesta = Respuesta :: new (CódigoDeEstado :: OK); respuesta.encabezados_mut(). insert ( " Tipo -DeContenido " , ValorDeEncabezado :: from_static ( "aplicación/json" )); respuesta.cuerpo() ; respuesta}
La get_user
función crea una User
instancia de estructura, la serializa en una cadena JSON y gestiona los errores asociados. A continuación, establece el tipo de contenido de la respuesta y escribe la estructura serializada como respuesta al cliente.application/json
Uso de middleware con Pavex
El middleware de Pavex simplifica la incorporación de pasos de preprocesamiento y posprocesamiento a las funciones de control. A continuación, se muestra un ejemplo de cómo usar middleware en sus proyectos de Pavex:
// src/middleware.rsusar pavex :: middleware :: Siguiente ; usar pavex :: respuesta :: Respuesta ; usar std :: futuro :: IntoFuture ;pub async fn logging_middlewareC(next: NextC) - Respuesta donde C: IntoFutureOutput=Response,{ println!("Antes de procesar la solicitud"); let response = next.await; println!("Después de procesar la solicitud"); response}
La logging_middleware
función utiliza los Next
objetos para facilitar el flujo de la solicitud. Registra un mensaje antes y después de la ejecución de la siguiente función de controlador en la cadena.
A continuación se muestra un ejemplo de cómo puede registrar el middleware en la register
función:
// rutas/mod.rspub mod estado;pub mod hola;pub mod json;pub mod middleware;use pavex::blueprint::{enrutador::GET, Blueprint};use pavex::blueprint::enrutador::POST;use pavex::f;pub fn register(bp: mut Blueprint) { bp.wrap(f!(self::middleware::logging_middleware)); bp.route(GET, "/api/ping", f!(self::status::ping)); bp.route(GET, "/api/hello/:name", f!(self::hello::hello)); bp.route(POST, "/api/users", f!(self::json::create_user)); bp.route(GET, "/api/usuarios/:id", f!(self::json::get_user));}
La wrap
función registra un middleware de encapsulamiento. logging_middleware
Ahora encapsula las funciones de controlador especificadas.
Comparación de Pavex con los frameworks Rust existentes
Aunque es nuevo, hemos visto que Pavex proporciona la mayoría de las características que necesitará en un marco web Rust, incluido soporte async/await, middleware, simultaneidad y mucho más.
Pavex es un framework interesante con mejor documentación, gestión de errores y semántica que otros frameworks web populares para Rust. Está diseñado para crear aplicaciones de nivel pequeño a empresarial sin sacrificar nada.
Así es como Pavex se compara actualmente con los marcos web Actix Web, Rocket, Axum y warp Rust:
Características | Pavex | Actix | Cohete | Axum | urdimbre |
---|---|---|---|---|---|
Compatibilidad con async/await | ✅ | ✅ | ✅ | ✅ | ✅ |
Middleware | Amplio soporte con middleware integrado y soporte para middleware personalizado | Amplio, con soporte para middleware personalizado | Soporte integrado para varias funcionalidades de middleware | Utiliza el ecosistema de la torre para middleware | Utiliza filtros para funcionalidades similares a las de middleware |
Compatibilidad con WebSockets | ❌ | Soporte integral | Compatible con sintaxis y funciones específicas | Compatible e integrado con el modelo de programación asíncrona | Compatible, diseñado para comunicación asincrónica |
Rendimiento de concurrencia | Desarrollado en Tokio y optimizado para ejecución asincrónica | Alto rendimiento, diseñado para concurrencia | Centrado en el rendimiento, con características específicas para la concurrencia | Desarrollado en Tokio y optimizado para ejecución asincrónica | Aprovecha la ejecución asincrónica para mejorar el rendimiento |
Gestión de cookies y sesiones | Aún no | Soporte completo | Capacidades de manejo integrales | A través de extractores y middleware | Mediante filtros e implementaciones personalizadas |
Comunidad y ecosistema | Pocos probadores beta en este momento | Grande, con amplios recursos | Bien establecido, con documentación completa | Beneficios crecientes del ecosistema de Tokio | Parte activa del ecosistema de Tokio |
La elección de un framework web Rust debe basarse en las especificaciones y necesidades de su proyecto. Puede usar esta tabla comparativa como guía para elegir un framework tras evaluar las especificaciones del proyecto.
Conclusión
Pavex es aún muy nuevo (en beta cerrada), y antes de que el proyecto esté disponible para el público, se espera que se implementen más funciones. Sin embargo, tenga en cuenta que no está diseñado para ser un framework de código abierto; Palmieri planea añadir un precio de uso al proyecto, aunque el plan de precios aún no está finalizado.
En este artículo, aprendimos sobre el framework Pavex y cómo usarlo para el desarrollo web en Rust. Pavex es un proyecto emocionante para muchos desarrolladores de Rust, especialmente porque mejora la funcionalidad de muchos frameworks existentes. Cuenta con una amplia experiencia en desarrollo; deberías probarlo cuando esté disponible.
Depurar aplicaciones Rust puede ser difícil, especialmente cuando los usuarios experimentan problemas difíciles de reproducir. Si te interesa supervisar y monitorizar el rendimiento de tus aplicaciones Rust, detectar errores automáticamente y monitorizar las solicitudes de red lentas y el tiempo de carga, prueba LogRocket.
Modernice su forma de depurar sus aplicaciones Rust: comience a monitorearlas de forma gratuita.
Si quieres conocer otros artículos parecidos a Uso de Pavex para el desarrollo web con Rust puedes visitar la categoría Desarrollo.
Entradas Relacionadas