32个版本 (4个稳定版)
1.0.3 | 2023年12月24日 |
---|---|
1.0.0 | 2023年11月22日 |
0.7.3 | 2023年11月20日 |
#160 in HTTP服务器
每月374次下载
43KB
833 代码行(不含注释)
快速入门
要开始使用Snowboard,只需将其添加到您的Cargo.toml
文件中
[dependencies]
snowboard = "*"
然后,创建一个新的Rust文件,代码如下
use snowboard::{headers, response, Method, Result, Server};
fn main() -> Result {
let data = "Hello, world!";
let server = Server::new("localhost:8080")?;
println!("Listening on {}", server.pretty_addr()?);
server.run(move |mut req| {
if req.method == Method::DELETE {
return response!(method_not_allowed, "Caught you trying to delete!");
}
req.set_header("X-Server", "Snowboard");
println!("{req:#?}");
response!(ok, data, headers! { "X-Hello" => "World!" })
})
}
这样就完成了!您已经拥有了一个在8080端口的运行服务器。示例可以在examples
文件夹中找到。
异步路由
您可以使用async
功能和使用Server::run_async
运行异步路由
# Cargo.toml
[dependencies]
snowboard = { version = "*", features = ["async"] }
// src/main.rs
use snowboard::{Request, ResponseLike, Server, Result};
use async_std::task;
use std::duration::Duration;
async fn index(_: Request) -> impl ResponseLike {
task::sleep(Duration::from_secs(1)).await;
"Async works"
}
fn main() -> Result {
Server::new("localhost:8080")?.run_async(index)
}
TLS
使用tls
功能(它还将安装native-tls
)来使用TLS
use anyhow::Result;
use snowboard::{
Identity, TlsAcceptor,
response, Server,
};
use std::fs;
fn main() -> Result<()> {
let der = fs::read("identity.pfx")?;
let password = ..;
let tls_acceptor = TlsAcceptor::new(Identity::from_pkcs12(&der, password)?)?;
Server::new_with_tls("localhost:3000", tls_acceptor)?
.run(|request| format!("{request:#?}"))
}
您可以通过运行以下命令来确认它是否正常工作:curl -k https://127.0.0.1:3000
(需要-k来允许自签名证书)
更多信息可以在examples/tls
中找到。
WebSockets
使用websocket
功能,实现WebSockets非常简单。示例(回声服务器)
use std::net::TcpStream;
use snowboard::Server;
use snowboard::WebSocket;
fn handle_ws(mut ws: WebSocket) {
while let Ok(msg) = ws.read() {
ws.send(msg).unwrap();
}
}
fn main() -> snowboard::Result {
Server::new("localhost:3000")?
.on_websocket("/ws", handle_ws)
.run(|_| "Try `/ws`!")
}
路由
可以使用Url
结构轻松处理路由
use snowboard::{response, Request, ResponseLike, Result, Server};
fn router(req: Request) -> impl ResponseLike {
// /{x}
match req.parse_url().at(0) {
Some("ping") => response!(ok, "Pong!"),
Some("api") => response!(not_implemented, "👀"),
None => response!(ok, "Hello, world!"),
_ => response!(not_found, "Route not found"),
}
}
fn main() -> Result {
Server::new("localhost:8080")?.run(router);
}
集成
JSON
使用json
功能支持JSON(序列化和反序列化)
use serde_json::Value;
use snowboard::{Response, Server};
#[derive(serde::Deserialize)]
struct Example {
number: isize,
}
fn main() -> snowboard::Result {
Server::new("localhost:8080")?.run(|req| -> Result<Value, Response> {
let example: Example = req.force_json()?;
Ok(serde_json::json!({
"number_plus_one": example.number + 1
}))
});
}
use snowboard::Server;
fn main() -> snowboard::Result {
Server::new("localhost:3000")?.run(|r| {
serde_json::json!({
"ip": r.ip(),
"url": r.parse_url(),
"method": r.method,
"body": r.text(),
"headers": r.headers,
})
})
}
force_json
返回解析后的JSON或错误请求响应的结果。如果您想自己处理错误,请使用json
。
ResponseLike
Snowboard的ResponseLike
旨在与几乎所有东西一起工作,但默认情况下它不会与某些情况一起工作,例如maud
的html!
宏。如果您使用了大量不与Snowboard一起工作的crate,请提出一个issue、pr或为它实现ResponseLike
use snowboard::{Response, ResponseLike, Server};
struct Example {
num: usize,
}
impl ResponseLike for Example {
fn to_response(self) -> Response {
snowboard::response!(ok, self.num.to_string())
}
}
fn main() -> snowboard::Result {
Server::new("localhost:8080")?
.run(|_| Example { num: 5 });
}
MSRV(最低支持的Rust版本)
MSRV是1.60.0,但它可能会根据启用哪些功能而变化(降低或升高)。
贡献
请查看 CONTRIBUTING.md 以获取如何帮助项目的简单指南。
许可证
此代码遵循MIT许可证,可在以下地址找到:LICENSE
依赖项
~1–11MB
~124K SLoC