#web-framework #框架 #web #http

racoon

松鼠是一个快速、完全可定制的 Rust Web 框架,注重简洁。

8 个版本

0.1.7 2024 年 7 月 12 日
0.1.6 2024 年 6 月 30 日
0.1.1 2024 年 5 月 11 日
0.1.0 2024 年 4 月 26 日

#275HTTP 服务器

Download history • Rust 包仓库 124/week @ 2024-04-26 • Rust 包仓库 3/week @ 2024-05-03 • Rust 包仓库 165/week @ 2024-05-10 • Rust 包仓库 16/week @ 2024-05-17 • Rust 包仓库 5/week @ 2024-05-24 • Rust 包仓库 1/week @ 2024-05-31 • Rust 包仓库 227/week @ 2024-06-21 • Rust 包仓库 501/week @ 2024-06-28 • Rust 包仓库 41/week @ 2024-07-05 • Rust 包仓库 125/week @ 2024-07-12 • Rust 包仓库

每月 127 次下载

MIT 许可证

215KB
5K SLoC

松鼠


Racoon

松鼠是一个快速、完全可定制的 Rust Web 框架,注重简洁。

要使用松鼠,您需要至少 Rust 版本 1.75.0Tokio 运行时。

学习松鼠

安装

运行松鼠需要 tokio 运行时。运行 cargo add tokio 安装 tokio crate。

[dependencies]
racoon = "0.1.7"

基本用法

use racoon::core::path::Path;
use racoon::core::request::Request;
use racoon::core::response::{HttpResponse, Response};
use racoon::core::response::status::ResponseStatus;
use racoon::core::server::Server;

use racoon::view;

async fn home(request: Request) -> Response {
    HttpResponse::ok().body("Home")
}

#[tokio::main]
async fn main() {
    let paths = vec![
        Path::new("/", view!(home))
    ];

    let result = Server::bind("127.0.0.1:8080")
        .urls(paths)
        .run().await;

    println!("Failed to run server: {:?}", result);
}

文件处理

在松鼠中处理文件有多种方式。最简单的方法是使用 request.parse() 方法。

use racoon::core::request::Request;
use racoon::core::response::{HttpResponse, Response};
use racoon::core::response::status::ResponseStatus;
use racoon::core::forms::FileField;
use racoon::core::shortcuts::SingleText;

async fn upload_form(request: Request) -> Response {
    if request.method == "POST" {
        // Parses request body
        let (form_data, files) = request.parse().await;
        println!("Name: {:?}", form_data.value("name"));

        let file = files.value("file");
        println!("File: {:?}", file);
        return HttpResponse::ok().body("Uploaded");
    }

    HttpResponse::bad_request().body("Use POST method to upload file.")
}

更多信息请参阅 表单处理指南

WebSocket 示例

use racoon::core::path::Path;
use racoon::core::request::Request;
use racoon::core::response::Response;
use racoon::core::server::Server;
use racoon::core::websocket::{Message, WebSocket};

use racoon::view;

async fn ws(request: Request) -> Response {
    let (websocket, connected) = WebSocket::from(&request).await;
    if !connected {
        // WebSocket connection didn't success
        return websocket.bad_request().await;
    }

    println!("WebSocket client connected.");

    // Receive incoming messages
    while let Some(message) = websocket.message().await {
        match message {
            Message::Text(text) => {
                println!("Message: {}", text);

                // Sends received message back
                let _ = websocket.send_text(text.as_str()).await;
            }
            _ => {}
        }
    }
    websocket.exit()
}

#[tokio::main]
async fn main() {
    let paths = vec![
        Path::new("/ws/", view!(ws))
    ];

    let _ = Server::bind("127.0.0.1:8080")
        .urls(paths)
        .run().await;
}

基准测试

wrk -c100 -d8s -t4 http://127.0.0.1:8080

在 AMD Ryzen 5 7520U 和 Radeon 图形卡上的结果。

Running 8s test @ http://127.0.0.1:8080/
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   374.62us  219.91us   3.91ms   76.47%
    Req/Sec    62.42k     4.25k   70.53k    82.50%
  1987462 requests in 8.00s, 140.26MB read
Requests/sec: 248389.96
Transfer/sec:     17.53MB

这个基准测试在现实中没有意义。

依赖项

~43–58MB
~1M SLoC