#http-server #web-server #web-framework #http #server #web #http-request

just_serve_it

轻量级且多线程的 Rust 后端网页框架

1 个稳定版本

1.0.0 2024年5月30日

#2191网页编程

GPL-3.0 许可证

26KB
674 代码行

just_serve_it

just_serve_it 是用 Rust 编写的轻量级且多线程的 网页框架。它被设计用来高效处理 HTTP 请求,为构建网页应用程序和 API 提供坚实的基础。just_serve_it 专注于简洁和性能,提供了路由、中间件和静态文件服务的基本功能。

特性

  • HTTP 请求处理: just_serve_it 处理 HTTP 请求,非常适合不需要 HTTPS 的应用程序。
  • 多线程: 使用 Rust 强大的并发特性高效处理多个请求。
  • 路由: 定义不同 HTTP 方法(GET、POST 等)的路由,并根据 URL 模式处理请求。
  • 中间件支持: 使用中间件来处理请求和响应,实现如日志记录、身份验证和正文解析等功能。
  • 静态文件服务: 从指定的目录(如 HTML、CSS 和 JavaScript 文件)提供服务。
  • 错误处理: 可定制的错误处理,为不同的错误条件提供用户友好的响应。

安装

cargo add just_serve_it

用法

以下是一个演示如何使用 just_serve_it 框架的示例。

use just_serve_it;
use just_serve_it::{middleware, path::Path, request::Request, response::Response, Server};
use std::io::Result;
use std::thread::sleep;
use std::time::Duration;

fn main() -> Result<()> {
    let mut server = Server::new("HTTP Server");

    server.not_found(not_found)?;
    server._use_(middleware::ServeStatic::dir("public"));
    server._use_(middleware::BodyParser::json());
    server._use_(middleware::BodyParser::url_encoded());

    server.get("/", root_handler)?;
    server.get("/about", about_handler)?;
    server.post("/", root_post_handler)?;

    server.listen("127.0.0.1", 8080, || {
        println!("Listening on 127.0.0.1:8080");
        Ok(())
    })?;

    Ok(())
}

fn root_handler(_req: Request, mut res: Response) -> Result<()> {
    res.send("/> Home Page!")?;
    Ok(())
}

fn about_handler(_req: Request, mut res: Response) -> Result<()> {
    sleep(Duration::from_secs(4));
    res.send("/about> About Page!")?;
    Ok(())
}

fn not_found(_req: Request, mut res: Response) -> Result<()> {
    res.status.status_code = 404;
    let path = Path::new("public");
    res.send_file(path.join("NotFound.html").to_str())?;
    Ok(())
}

fn root_post_handler(req: Request, mut res: Response) -> Result<()> {
    if let Some(body) = req.body {
        println!("RAW: {:?}", body.raw.unwrap());

        if let Some(json_data) = body.json {
            println!("JSON: {:?}", json_data);
        }

        if let Some(url_encoded_data) = body.url_encoded {
            println!("URL-ENCODED: {:?}", url_encoded_data);
        }

        let path = Path::new("public");
        res.send_file(path.join("home.html").to_str())?;
    } else {
        res.send("No Data!")?;
    }

    Ok(())
}

贡献

欢迎贡献!请fork仓库并提交一个 pull request。

依赖

~0.5–1MB
~22K SLoC