La estructura Request
Request es el extractor principal para trabajar con solicitudes HTTP en controladores web de Sword.
Atributo extensions
rust
pub extensions: ExtensionsRetorna
- Extensiones de Axum asociadas a la request actual.
Cuándo usarlo
- Para leer estado agregado por layers o interceptores previos.
Referencia de métodos
Método uri()
rust
pub fn uri(&self) -> StringRetorna
- URI completa de la solicitud.
Método method()
rust
pub fn method(&self) -> &MethodRetorna
- Método HTTP (
GET,POST, etc.).
Método header()
rust
pub fn header(&self, key: &str) -> Option<&str>Retorna
- Valor de header si existe y es UTF-8 válido.
Método headers()
rust
pub fn headers(&self) -> &HeaderMapRetorna
- Referencia inmutable al
HeaderMapcompleto.
Método headers_mut()
rust
pub fn headers_mut(&mut self) -> &mut HeaderMapRetorna
- Referencia mutable al
HeaderMap.
Método set_header()
rust
pub fn set_header(
&mut self,
name: impl Into<String>,
value: impl Into<String>,
) -> Result<(), RequestError>Retorna
Ok(())si inserta/reemplaza correctamente.Err(RequestError)si nombre o valor son inválidos.
Método param::<T>()
rust
pub fn param<T>(&self, key: &str) -> Result<T, RequestError>
where
T: FromStr,
T::Err: Display,Retorna
Ok(T)si el parámetro existe y parsea.Err(RequestError)si no existe o no puede parsearse.
Cuándo usarlo
- Parámetros de ruta como
/users/{id}.
Método body::<T>()
rust
pub fn body<T: DeserializeOwned>(&self) -> Result<T, RequestError>Retorna
Ok(T)si el body es JSON válido compatible conT.Err(RequestError)si body vacío, media type inválido o deserialización fallida.
Cuándo usarlo
- Requests JSON en endpoints
POST,PUT,PATCH.
Método query::<T>()
rust
pub fn query<T: DeserializeOwned>(&self) -> Result<Option<T>, RequestError>Retorna
Ok(Some(T))si hay query string válida.Ok(None)si no hay query string.Err(RequestError)si la query existe pero no deserializa.
Método cookies()
rust
pub fn cookies(&self) -> Result<&Cookies, JsonResponse>Retorna
Ok(&Cookies)si la capa de cookies está disponible.Err(JsonResponse)si no puede extraer cookies.
Cuándo no usarlo
- Si no tienes habilitada/aplicada la
CookieManagerLayeren el router.
Método authorization()
rust
pub fn authorization(&self) -> Option<&str>Retorna
- Valor del header
Authorization.
Método user_agent()
rust
pub fn user_agent(&self) -> Option<&str>Retorna
- Valor del header
User-Agent.
Método ip()
rust
pub fn ip(&self) -> Option<&str>Retorna
- Primer valor de
X-Forwarded-Forcomo texto.
Método ips()
rust
pub fn ips(&self) -> Option<Vec<&str>>Retorna
- Lista de IPs en
X-Forwarded-Forseparadas por coma.
Método protocol()
rust
pub fn protocol(&self) -> &strRetorna
- Valor de
X-Forwarded-Protoo"http"por defecto.
Método content_type()
rust
pub fn content_type(&self) -> Option<&str>Retorna
- Valor de
Content-Type.
Método content_length()
rust
pub fn content_length(&self) -> Option<u64>Retorna
Content-Lengthparseado au64.
Método id()
rust
pub fn id(&self) -> StringRetorna
- Request ID de
RequestIdLayer. "unknown"si no está disponible.
Método next()
rust
pub async fn next(self) -> WebInterceptorResultRetorna
- Resultado de la cadena de interceptores.
Cuándo usarlo
- Solo dentro de implementaciones
OnRequest*.
Cuándo no usarlo
- En handlers web normales.
Notas operativas
ip(),ips()yprotocol()dependen de headers de proxy (X-Forwarded-For,X-Forwarded-Proto).body::<T>()exigeContent-TypeJSON (application/jsono+json).
Ejemplo de uso
rust
use serde::Deserialize;
use sword::prelude::*;
use sword::web::*;
#[derive(Deserialize)]
struct ListUsersQuery {
page: Option<u32>,
}
#[controller(kind = Controller::Web, path = "/users")]
pub struct UsersController;
impl UsersController {
#[get("/{id}")]
async fn get_user(&self, req: Request) -> WebResult {
let id = req.param::<u64>("id")?;
let query = req.query::<ListUsersQuery>()?.unwrap_or(ListUsersQuery { page: Some(1) });
let ua = req.user_agent().unwrap_or("unknown");
Ok(JsonResponse::Ok().data(format!(
"id={id}, page={:?}, ua={ua}",
query.page
)))
}
}
