Respuesta

En un Handler, el Response se pasa como parámetro:

  • La estructura Response encapsula todos los componentes de una respuesta HTTP, proporcionando una API completa para construir y manipular respuestas HTTP.
  • Admite un estilo fluido y encadenable (por ejemplo, res.status_code(200).body("Hello")), facilitando la construcción fluida de respuestas.
  • Sus funcionalidades principales incluyen:
    • Establecer códigos de estado y cabeceras
    • Manipular el cuerpo de la respuesta (admite cadenas de texto, bytes, archivos y datos en streaming)
    • Gestionar Cookies
    • Múltiples métodos de renderizado de contenido
  • Esta estructura emplea un patrón de referencia mutable, devolviendo una referencia a sí misma mediante &mut self, lo que permite a los handlers construir y personalizar convenientemente las respuestas HTTP para satisfacer diversos requisitos de servicios web.
#[handler]
async fn hello_world(res: &mut Response) {
    res.render("Hello world!");
}

Después de que el servidor recibe una solicitud del cliente, cualquier Handler o middleware coincidente puede escribir datos en el Response. En ciertos escenarios, como cuando un middleware desea evitar la ejecución de middleware y Handlers posteriores, se puede usar FlowCtrl:

#[handler]
async fn hello_world(res: &mut Response, ctrl: &mut FlowCtrl) {
    ctrl.skip_rest();
    res.render("Hello world!");
}

Escribir Contenido

Escribir datos en un Response es sencillo:

  • Escribir datos de texto plano

    res.render("Hello world!");
  • Escribir datos serializados en JSON

    use serde::Serialize;
    use salvo::prelude::Json;
    
    #[derive(Serialize, Debug)]
    struct User {
        name: String,
    }
    let user = User{name: "jobs".to_string()};
    res.render(Json(user));
Warning

Si se llama al método render varias veces para escribir datos JSON, estos datos no se fusionarán en un único objeto JSON. En su lugar, se concatenarán secuencialmente como fragmentos de texto independientes, lo que podría resultar en un formato JSON no válido. Si se necesitan devolver múltiples elementos de datos, deben combinarse en un solo objeto antes de la serialización, o la lógica debe manejarse manualmente.

  • Escribir HTML

    res.render(Text::Html("<html><body>hello</body></html>"));

Escribir Errores HTTP

  • Usar render permite escribir información detallada de error en el Response.

    use salvo::http::errors::*;
    res.render(StatusError::internal_server_error().brief("error when serialize object to json"))
  • Si no se necesita información de error personalizada, se puede llamar directamente a set_http_code.

    use salvo::http::StatusCode;
    res.status_code(StatusCode::BAD_REQUEST);

Redirigir a Otra URL

  • Usando el método render, se puede escribir una respuesta de redirección en el Response, navegando a una nueva URL. Cuando se llama a Redirect::found, establece el código de estado HTTP en 302 (Found), indicando una redirección temporal.
    use salvo::prelude::*;
    
    #[handler]
    async fn redirect(res: &mut Response) {
        res.render(Redirect::found("https://salvo.rs/"));
    }

ResBody

El tipo de Body devuelto por Response es ResBody, que es una enumeración. En caso de error, se establece en ResBody::Error, conteniendo información de error para un manejo diferido de errores. Es importante destacar que StatusError no implementa Writer; este diseño permite personalizar su visualización en el Catcher.

Resumen de Métodos de la Estructura Response

CategoríaMétodoDescripción
Creaciónnew() / with_cookies()Crear una nueva respuesta
Código de Estadostatus_code()Establecer el código de estado
Cabecerasheaders()/headers_mut()Obtener cabeceras
set_headers()/add_header()Establecer/Añadir cabeceras
content_type()Obtener tipo de contenido
Versión HTTPversion()/version_mut()Obtener/Modificar versión HTTP
Cuerpo de la Respuestabody()/body_mut()Establecer/Obtener el cuerpo de la respuesta
replace_body()/take_body()Reemplazar/Extraer el cuerpo de la respuesta
write_body()Escribir datos en el cuerpo de la respuesta
stream()/channel()Respuesta en streaming / Crear un canal de envío
Gestión de Cookiescookies()/cookie()Obtener cookies / Obtener una cookie específica
add_cookie()/remove_cookie()Añadir/Eliminar una cookie
Respuesta de Contenidorender()Renderizar contenido
stuff()Establecer código de estado y renderizar contenido
send_file()Enviar un archivo
Consulta de Estadois_stamped()Comprobar si la respuesta está lista para ser escrita de vuelta