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

Json<T> renderiza un documento JSON completo. En Salvo 0.94 y versiones posteriores, renderizar Json reemplaza los bytes del cuerpo ya almacenados en Response en lugar de anexarlos. Para emitir varios registros JSON, serializa cada registro manualmente y añádelo con write_body, por ejemplo al producir NDJSON.

  • 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
render_with_status()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