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 日 |
#275 在 HTTP 服务器
每月 127 次下载
215KB
5K SLoC
松鼠
松鼠是一个快速、完全可定制的 Rust Web 框架,注重简洁。
要使用松鼠,您需要至少 Rust 版本 1.75.0
和 Tokio
运行时。
安装
运行松鼠需要 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