#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 124/week @ 2024-04-26 3/week @ 2024-05-03 165/week @ 2024-05-10 16/week @ 2024-05-17 5/week @ 2024-05-24 1/week @ 2024-05-31 227/week @ 2024-06-21 501/week @ 2024-06-28 41/week @ 2024-07-05 125/week @ 2024-07-12

每月 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