Añade soporte a respuestas JSON

This commit is contained in:
Manuel Cillero 2025-07-25 19:18:06 +02:00
parent d85458d357
commit 2dfca51c31
3 changed files with 45 additions and 2 deletions

View file

@ -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::*;

View file

@ -2,4 +2,6 @@
pub use actix_web::ResponseError;
pub mod json;
pub mod redirect;

41
src/response/json.rs Normal file
View file

@ -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<NuevoUsuario>) -> 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<Usuario> {
//! Json(Usuario { id: 1, nombre: "Ada".into() })
//! }
//! ```
//!
//! `Json<T>` funciona con cualquier tipo que implemente `serde::Serialize` (para respuestas) y/o
//! `serde::Deserialize` (para peticiones).
pub use actix_web::web::Json;