From 2dfca51c3131a1b1414b0079fb21687d680ad623 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Fri, 25 Jul 2025 19:18:06 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20A=C3=B1ade=20soporte=20a=20respuest?= =?UTF-8?q?as=20JSON?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/prelude.rs | 4 ++-- src/response.rs | 2 ++ src/response/json.rs | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 src/response/json.rs diff --git a/src/prelude.rs b/src/prelude.rs index 7baa687..9334f18 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -34,7 +34,7 @@ pub use crate::locale::*; pub use crate::datetime::*; pub use crate::service; -pub use crate::service::HttpRequest; +pub use crate::service::{HttpRequest, HttpResponse}; pub use crate::core::{AnyCast, AnyInfo, TypeInfo}; @@ -43,7 +43,7 @@ pub use crate::core::component::*; pub use crate::core::extension::*; pub use crate::core::theme::*; -pub use crate::response::{redirect::*, ResponseError}; +pub use crate::response::{json::*, redirect::*, ResponseError}; pub use crate::base::action; pub use crate::base::component::*; diff --git a/src/response.rs b/src/response.rs index cf18377..1fce663 100644 --- a/src/response.rs +++ b/src/response.rs @@ -2,4 +2,6 @@ pub use actix_web::ResponseError; +pub mod json; + pub mod redirect; diff --git a/src/response/json.rs b/src/response/json.rs new file mode 100644 index 0000000..fee4c12 --- /dev/null +++ b/src/response/json.rs @@ -0,0 +1,41 @@ +//! Extractor y generador de respuestas JSON (reexporta [`actix_web::web::Json`]). +//! +//! # Uso como extractor JSON +//! +//! Convierte automáticamente el cuerpo de una petición con `Content-Type: application/json` en un +//! tipo Rust fuertemente tipado, validando el formato y deserializando con *serde*. +//! +//! ```rust +//! use pagetop::prelude::*; +//! +//! #[derive(serde::Deserialize)] +//! struct NuevoUsuario { nombre: String, email: String } +//! +//! // Manejador configurado para la ruta POST "/usuarios". +//! async fn crear_usuario(payload: Json) -> HttpResponse { +//! // `payload` ya es `NuevoUsuario`; si la deserialización falla, +//! // devolverá automáticamente 400 Bad Request con un cuerpo JSON que describe el error. +//! HttpResponse::Ok().finish() +//! } +//! ``` +//! +//! # Uso como generador de respuestas JSON +//! +//! Serializa valores Rust a JSON y genera una respuesta HTTP con el encabezado apropiado +//! `application/json; charset=utf-8`, todo con una llamada compacta. +//! +//! ```rust +//! use pagetop::prelude::*; +//! +//! #[derive(serde::Serialize)] +//! struct Usuario { id: u32, nombre: String } +//! +//! async fn obtener_usuario() -> Json { +//! Json(Usuario { id: 1, nombre: "Ada".into() }) +//! } +//! ``` +//! +//! `Json` funciona con cualquier tipo que implemente `serde::Serialize` (para respuestas) y/o +//! `serde::Deserialize` (para peticiones). + +pub use actix_web::web::Json;