Rust: Einfacher Webserver mit Menü und Eingabeformular

Der bereitgestellte Rust-Code dient dazu, einen einfachen Webserver zu erstellen, der mit dem Webframework warp läuft. Der Server läuft auf localhost Port 8090 und hat vier Seiten und ein Menü: eine Startseite, eine Seite namens “Seite 1” (das Eingabeformular), eine Seite namens “Seite 2” und eine Seite namens “Seite 3”. Wenn man im Eingabeformular auf “Absenden” klickt, wird die Eingabe auf der Antwortseite des Servers angezeigt.

Screenshot

Cargo.toml

[dependencies]
warp = "0.3"
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["full"] }

main.rs

use warp::{Filter};
use std::net::SocketAddr;

#[derive(serde::Deserialize)]
struct FormData {
    eingabe: String,
}

#[tokio::main]
async fn main() {
    // Definiere die Filter für die verschiedenen Seiten
    let home = warp::path::end().map(|| create_home_page());
    let page1 = warp::path!("page1")
        .and(warp::get().map(|| create_page1(None))) // Für GET-Anfragen
        .or(warp::path!("page1").and(warp::post().and(warp::body::form()).map(|form: FormData| handle_post(form)))); // Für POST-Anfragen
    let page2 = warp::path!("page2").map(|| create_page2());
    let page3 = warp::path!("page3").map(|| create_page3());

    // Kombiniere die Filter für die Seiten in ein Menü
    let menu = home.or(page1).or(page2).or(page3);

    // Definiere den Host und den Port
    let host = "127.0.0.1";
    let port = 8090;

    let socket_addr = format!("{}:{}", host, port)
        .parse::<SocketAddr>()
        .expect("Ungültige Socket-Adresse");

    // Starte den Server auf der angegebenen Socket-Adresse
    let server = warp::serve(menu.clone())
        .run(socket_addr);

    println!("Server gestartet auf http://{}:{}", host, port);

    // Warte bis der Server beendet wird
    server.await;
}

fn create_menu(content: &str, title: &str) -> warp::reply::Html<String> {
    let menu = format!(
        r#"
        <html>
        <head>
            <title>{}</title>
        </head>
        <body>
            <ul>
                <li><a href="/">Startseite</a></li>
                <li><a href="/page1">Seite 1</a></li>
                <li><a href="/page2">Seite 2</a></li>
                <li><a href="/page3">Seite 3</a></li>
            </ul>
            <div>{}</div>
        </body>
        </html>
        "#,
        title, content
    );

    warp::reply::html(menu)
}

fn create_home_page() -> warp::reply::Html<String> {
    create_menu("Willkommen auf der Startseite!", "Startseite")
}

fn create_page1(eingabe: Option<String>) -> warp::reply::Html<String> {
    let form = r#"
        <h2>Eingabeformular</h2>
        <form action="/page1" method="post">
            <label for="eingabe">Eingabe:</label>
            <input type="text" id="eingabe" name="eingabe" required>
            <button type="submit">Absenden</button>
        </form>
    "#;

    let content = match eingabe {
        Some(eingabe) => format!("{}{}", form, eingabe),
        None => form.to_string(),
    };

    create_menu(&content, "Seite 1")
}

fn create_page2() -> warp::reply::Html<String> {
    create_menu("Das ist Seite 2.", "Seite 2")
}

fn create_page3() -> warp::reply::Html<String> {
    create_menu("Das ist Seite 3.", "Seite 3")
}

fn handle_post(form: FormData) -> warp::reply::Html<String> {
    let message = format!("Die Eingabe ist: {}", form.eingabe);
    create_page1(Some(message))
}

Programm ausführen

cargo run

Siehe auch

docs.rs/warp Crate warp