#服务器 #http #后端 #Web应用程序 #模板引擎 #渲染引擎

sandy

一个简单的Rust HTTP服务器和模板渲染引擎

6个版本

0.2.7 2024年1月9日
0.2.6 2024年1月9日
0.1.0 2024年1月8日

#586HTTP服务器

MIT 许可证

19KB
244

Sandy

Sandy是一个Rust库,它提供简单的HTTP服务器和模板渲染引擎。它允许轻松创建HTTP服务器并处理不同的路由,同时为Web应用程序启用模板渲染。

目录

服务器使用

您可以使用 Server::new() 函数创建新的HTTP服务器

use sandy::Server;

let mut server = Server::new();

您可以使用 Server.run() 函数运行HTTP服务器

let ip = "127.0.0.1";
let port = "8080";
server.run(ip, port);

使用Slugs进行路由

要处理不同的路由,包括Slugs,请使用 route() 方法。您可以定义带有Slugs及其相应处理函数的路由。

例如,要处理一个带有Slugs的路由

server.route("/articles/:slug", |path, params, method, data| {
    if method == "GET" {
        let slug = params.get("slug").map_or_else(|| "".to_string(), |x| x.to_string());
        Ok(format!("HTTP/1.1 200 OK\n\nArticle content for slug: {}", slug))
    } else {
        Err("HTTP/1.1 405 METHOD NOT ALLOWED\n\nMethod Not Allowed".to_string())
    }
});
server.route("/articles", |path, params, method, data| {
    if method == "GET" {
        Ok(format!("HTTP/1.1 200 OK\n\nArticle content : Article1, ...."))
    } else {
        Err("HTTP/1.1 405 METHOD NOT ALLOWED\n\nMethod Not Allowed".to_string())
    }
});

处理不同的HTTP请求类型

GET 请求

要处理GET请求,您可以在路由中使用Slugs

server.route("/get/:param", |_, params, method, _| {
    if method == "GET" {
        let v = params.get("param").map_or_else(|| "".to_string(), |x| x.to_string());
        Ok(format!("HTTP/1.1 200 OK\n\n{}", v))
    } else {
        Err("HTTP/1.1 405 METHOD NOT ALLOWED\n\nMethod Not Allowed".to_string())
    }
});

POST 请求

要处理POST请求,可以使用与处理GET请求类似的方法使用Slugs

server.route("/post/:data", |_, _, method, data| {
    if method == "POST" {
        let v = data.get("data").map_or_else(|| "".to_string(), |x| x.to_string());
        Ok(format!("HTTP/1.1 200 OK\n\n{}", v))
    } else {
        Err("HTTP/1.1 405 METHOD NOT ALLOWED\n\nMethod Not Allowed".to_string())
    }
});

模板引擎使用

您可以使用 TemplateEngine::render_template() 函数渲染模板

use sandy::TemplateEngine;
use std::collections::HashMap;

let mut context = HashMap::new();
context.insert("name", "Just Ice");

let rendered = TemplateEngine::render_template("template.html", &context);

TemplateEngine::render() 函数使用上下文从字符串渲染模板

let template = "<p>Hello, {{ name }}!</p>";
let rendered = TemplateEngine::render(template, &context);

站点地图

要将自定义动态路由添加到站点地图

服务器还支持生成和更新用于SEO目的的站点地图。您可以使用 add_route_to_sitemap() 将路由添加到站点地图

let ip = "127.0.0.1";
let port = "8080";
server.add_route_to_sitemap("/about", true, "daily", 0.5, &format!("http://{}:{}", ip, port));

将所有静态路由添加到站点地图

服务器还支持生成和更新用于SEO目的的站点地图。您可以使用 generate_sitemap() 生成站点地图

server.add_route_to_sitemap("/", true, "daily", 0.8, "https://example.com");
server.add_route_to_sitemap("/about", true, "monthly", 0.5, "https://example.com");

server.generate_sitemap(true, true, "daily", 0.7, "https://example.com");

静态路由

您可以通过定义静态路由来提供静态内容。例如,提供静态HTML文件

server.static_route("/", "<html><body><h1>Welcome to Sandy!</h1></body></html>");

完整示例

展示在路由中使用Slugs的示例

use sandy::Server;
use sandy::TemplateEngine;
use std::collections::HashMap;

fn main() {
    let mut server = Server::new();

    server.route("/", |_, _, _, _| {
        Ok("HTTP/1.1 200 OK\n\nHello, Sandy!".to_string())
    });

    server.route("/get/:param", |_, params, method, _| {
        if method == "GET" {
            let v = params.get("param").map_or_else(|| "".to_string(), |x| x.to_string());
            Ok(format!("HTTP/1.1 200 OK\n\n{}", v))
        } else {
            Err("HTTP/1.1 405 METHOD NOT ALLOWED\n\nMethod Not Allowed".to_string())
        }
    });

    server.route("/post/:data", |_, _, method, data| {
        if method == "POST" {
            let v = data.get("data").map_or_else(|| "".to_string(), |x| x.to_string());
            Ok(format!("HTTP/1.1 200 OK\n\n{}", v))
        } else {
            Err("HTTP/1.1 405 METHOD NOT ALLOWED\n\nMethod Not Allowed".to_string())
        }
    });

    server.route("/render_template/:var", |_, _, _, _| {
        let context: HashMap<_, _> = [("var", "value")].iter().cloned().collect();
        match TemplateEngine::render_template("template.html", &context) {
            Ok(rendered) => Ok(format!("HTTP/1.1 200 OK\n\n{}", rendered)),
            Err(err) => Err(format!("HTTP/1.1 500 Internal Server Error\n\n{}", err)),
        }
    });

    server.route("/render/:var", |_, _, _, _| {
        let context: HashMap<_, _> = [("var", "value")].iter().cloned().collect();
        let template = "This is a {{ var }} template.";
        let rendered = TemplateEngine::render(template, &context);
        Ok(format!("HTTP/1.1 200 OK\n\n{}", rendered))
    });

    server.static_route("/", "<html><body><h1>Welcome to Sandy!</h1></body></html>");

    server.static_route("/about", "<html><body><h1>About Us</h1><p>This is the About Us page.</p></body></html>");

    server.run("0.0.0.0", "8080");
}

依赖项

~10-21MB
~284K SLoC