23 个版本

0.1.9 2020 年 12 月 13 日
0.1.8 2020 年 11 月 20 日
0.1.7 2020 年 10 月 21 日
0.1.3 2020 年 9 月 15 日
0.0.5 2020 年 5 月 28 日

#596 in HTTP 服务器


用于 deadwiki

MIT/Apache

93KB
1.5K SLoC

Drink Me.

~ vial: 一个微型微型框架 ~

Vial 是一个用于在 Rust 中创建小型网站的简易 Web "框架"。

它只包括一些基本功能

  • 解析和路由 HTTP 请求
  • 解析 POST 表单数据
  • 提供静态文件(css,js)

其他一切... 好吧,那就看你了。

目标是尽可能少的依赖项 Web 库,你可以用它快速测试一个想法或启动一个个人项目。 单文件、服务器端应用程序?当然! 快速编译?当然请! 按需 依赖项?这才对!

这有点像野餐,音乐播放列表全是 90 年代音乐,你还得自带饮料。 和食物。

想了解更多,请继续阅读或访问以下链接之一


⚠ 状态: Vial 目前处于早期开发阶段。它将与 deadwiki 一起开发,但那是 严格 用于个人用途。请谨慎行事,并始终保持警觉。


~ 入门 ~

要开始,只需将 vial 添加到您的 Cargo.toml

[dependencies]
vial = "0.1"

现在您可以在应用程序中使用 use vial::prelude::*; 来引入通用类型,或者像其他任何软件包一样使用该软件包。

~ Hello World ~

按照惯例

vial::routes! {
    GET "/" => |_| "Hello, world!";
}

fn main() {
    vial::run!().unwrap();
}

为了更有条理,您可以直接路由到函数

use vial::prelude::*;

routes! {
    GET "/echo" => echo;
    POST "/echo" => post;
}

fn echo(_: Request) -> &'static str {
    "<form method='POST'>
        <input type='text' name='echo'/>
        <input type='submit'/>
    </form>"
}

fn post(req: Request) -> String {
    format!(
        "<h1>You said: {}</h1>",
        req.form("echo").unwrap_or("You didn't say anything!")
    )
}

fn main() {
    vial::run!().unwrap();
}

要真正打破常规,您可以将其网站拆分为不同的模块

use vial;

mod wiki;
mod blog;

mod index {
    use vial::prelude::*;
    routes! {
        GET "/" => |_| Response::from_file("index.html")
    }
}

fn main() {
    // The order matters here - if `wiki` and `blog` both define "/",
    // the `mod index` version will match first and get run.
    vial::run!(index, wiki, blog);
}

但嘿,当你可以写 Rust 时,谁还想浪费时间在 HTML 上? 启用 horror 功能,你就可以开始了

use vial::prelude::*;

#[macro_use]
extern crate horrorshow;

routes! {
    GET "/" => |_| html! {
        p {
            : "You're looking for this: ";
            a(href="/echo") { : "echo" }
        }
    };
    GET "/echo" => echo;
    POST "/echo" => post;
}

fn echo(_: Request) -> impl Responder {
    html! {
        form(method="POST") {
            p {
            : "Type something: ";
                input(type="text", name="echo");
                input(type="submit");
            }
        }
    }
}

fn post(req: Request) -> impl Responder {
    owned_html! {
        h1: req.form("echo")
            .unwrap_or("You didn't say anything!");
    }
}

fn main() {
    vial::run!().unwrap();
}

~ 奖励功能 ~

默认不包含JSON或模板引擎等花哨的功能,但(将会提供)一些编译时可以激活的--features来提高生产力

Alice
  • 帽子:启用帽子:一个正派疯狂、基于HTML的模板语言。
  • 恐怖:启用恐怖秀:一个小巧快速的基于宏的HTML构建器。
  • json_serde:通过Serde提供Request::jsonResponse::with_json功能。
  • cookieRequest::cookie()Response::with_cookie和相关功能。
  • 会话:支持会话。
  • 上传:多部分表单数据(文件上传)
  • 日志:访问日志

请注意:上面的列表是一个正在开发中的列表。

~ 热重载 ~

在调试模式下,您的资产将自动重新加载,包括适当的ETag支持,但您可能还想刷新您的Rust代码。

目前最简单的方法是使用cargo-watch

$ cargo install cargo-watch
$ cargo watch -x 'run --example hello_world'

~ 测试 ~

可以使用make test在稳定的Rust的较新版本上运行测试。我们还使用GitHub Actions运行提交的测试。

更愿意将所有内容放在tests/中,而不是直接在src/*.rs文件中包含测试。为了在测试中访问私有API,我们将它们设置为pub,并使用#[doc(hidden)]。感谢您的合作。

~ 许可 ~

根据您的选择,采用以下任一许可

依赖项

~0–0.9MB
~14K SLoC