Risposta

In un Handler, la Response viene passata come parametro:

  • La struttura Response incapsula tutti i componenti di una risposta HTTP, fornendo un'API completa per costruire e manipolare le risposte HTTP.
  • Supporta uno stile fluido e concatenabile (es. res.status_code(200).body("Hello")), facilitando la costruzione fluida delle risposte.
  • Le funzionalità principali includono:
    • Impostazione dei codici di stato e degli header
    • Manipolazione del corpo della risposta (supporto per stringhe, byte, file e dati in streaming)
    • Gestione dei Cookie
    • Metodi multipli per il rendering dei contenuti
  • Questa struttura utilizza un pattern di riferimento mutabile, restituendo un riferimento a sé stessa tramite &mut self, permettendo agli handler di costruire e personalizzare comodamente le risposte HTTP per soddisfare varie esigenze dei servizi web.
#[handler]
async fn hello_world(res: &mut Response) {
    res.render("Hello world!");
}

Dopo che il server riceve una richiesta dal client, qualsiasi Handler o middleware corrispondente può scrivere dati nella Response. In alcuni scenari, come quando un middleware desidera impedire l'esecuzione dei middleware e Handler successivi, puoi utilizzare FlowCtrl:

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

Scrittura del Contenuto

Scrivere dati in una Response è semplice:

  • Scrittura di dati in testo semplice

    res.render("Hello world!");
  • Scrittura di dati serializzati 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

Se il metodo render viene chiamato più volte per scrivere dati JSON, questi dati non verranno uniti in un singolo oggetto JSON. Invece, verranno concatenati sequenzialmente come frammenti di testo indipendenti, potenzialmente risultando in un formato JSON non valido. Se è necessario restituire più elementi di dati, dovrebbero essere combinati in un singolo oggetto prima della serializzazione, oppure la logica dovrebbe essere gestita manualmente.

  • Scrittura HTML

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

Scrittura Errori HTTP

  • Utilizzando render è possibile scrivere informazioni dettagliate sull'errore nella Response.

    use salvo::http::errors::*;
    res.render(StatusError::internal_server_error().brief("errore durante la serializzazione dell'oggetto in json"))
  • Se non sono necessarie informazioni di errore personalizzate, puoi chiamare direttamente set_http_code.

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

Reindirizzamento a un Altro URL

  • Utilizzando il metodo render, puoi scrivere una risposta di reindirizzamento nella Response, navigando verso un nuovo URL. Quando chiami Redirect::found, imposta il codice di stato HTTP a 302 (Found), indicando un reindirizzamento temporaneo.
    use salvo::prelude::*;
    
    #[handler]
    async fn redirect(res: &mut Response) {
        res.render(Redirect::found("https://salvo.rs/"));
    }

ResBody

Il tipo Body restituito da Response è ResBody, che è un'enumerazione. In caso di errore, viene impostato a ResBody::Error, contenente informazioni sull'errore per una gestione differita degli errori. È importante notare che StatusError non implementa Writer; questo design ti permette di personalizzarne la visualizzazione nel Catcher.

Panoramica dei Metodi della Struttura Response

CategoriaMetodoDescrizione
Creazionenew() / with_cookies()Crea una nuova risposta
Codice di Statostatus_code()Imposta il codice di stato
Headerheaders()/headers_mut()Ottieni gli header
set_headers()/add_header()Imposta/Aggiungi header
content_type()Ottieni il tipo di contenuto
Versione HTTPversion()/version_mut()Ottieni/Modifica la versione HTTP
Corpo della Rispostabody()/body_mut()Imposta/Ottieni il corpo della risposta
replace_body()/take_body()Sostituisci/Estrai il corpo della risposta
write_body()Scrivi dati nel corpo della risposta
stream()/channel()Risposta in streaming / Crea un canale di invio
Gestione Cookiecookies()/cookie()Ottieni i cookie / Ottieni un cookie specifico
add_cookie()/remove_cookie()Aggiungi/Rimuovi un cookie
Risposta Contenutorender()Renderizza il contenuto
stuff()Imposta il codice di stato e renderizza il contenuto
send_file()Invia un file
Verifica Statois_stamped()Controlla se la risposta è pronta per essere riscritta