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

Json<T> renderizza un documento JSON completo. In Salvo 0.94 e versioni successive, renderizzare Json sostituisce i byte del corpo gia presenti in Response invece di accodarli. Per emettere piu record JSON, serializza manualmente ogni record e accodalo con write_body, ad esempio producendo NDJSON.

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