32个版本 (4个稳定版)

1.0.3 2023年12月24日
1.0.0 2023年11月22日
0.7.3 2023年11月20日

#160 in HTTP服务器

Download history 1/week @ 2024-07-02

每月374次下载

MIT许可证

43KB
833 代码行(不含注释)

Snowboard 🏂

License GitHub issues Build status DeepSource dependency status

一个极其简单(且速度极快)的Rust HTTP和HTTPS服务器库

请求功能/报告错误

目录

快速入门

要开始使用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旨在与几乎所有东西一起工作,但默认情况下它不会与某些情况一起工作,例如maudhtml!宏。如果您使用了大量不与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