8个版本

0.1.8 2018年10月16日
0.1.7-beta2018年9月24日
0.1.5-beta2018年8月21日

#1258 in HTTP服务器

每月24次下载

MIT/Apache

55KB
913

Direkuta(导演)

Direkuta是一个针对Rust的REST聚焦的Web框架。它在Hyper之上包装,包括状态、中间件和路由(带有参数!)。

有时文档无法构建,我不知道为什么,但您可以在源代码中轻松查看。

示例

以下是一个简单的“Hello World!”示例,这个例子被用来测试基准。

extern crate direkuta;

use direkuta::prelude::*;

fn main() {
    Direkuta::new()
        .route(|r| {
            r.get("/", |_, _, _| {
                Response::new().with_body("Hello World!").build()
            });
        }).run("0.0.0.0:3000");
}

性能

所有这些都在Intel i3 8100 @ 3.60GHz上运行。

Hyper Hello 示例(发布版)

$ wrk -t10 -c400 -d30s http://0.0.0.0:3000/ --latency
Running 30s test @ http://0.0.0.0:3000/
  10 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     7.77ms    4.63ms  31.50ms   64.66%
    Req/Sec     2.67k   328.58     5.49k    71.73%
  Latency Distribution
     50%    7.14ms
     75%   11.16ms
     90%   14.34ms
     99%   18.95ms
  798726 requests in 30.10s, 67.03MB read
Requests/sec:  26540.04
Transfer/sec:      2.23MB

Direkuta Hello 示例(发布版)

$ wrk -t10 -c400 -d30s http://0.0.0.0:3000/ --latency
Running 30s test @ http://0.0.0.0:3000/
  10 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     8.13ms    4.67ms  29.20ms   63.54%
    Req/Sec     2.57k   312.47     7.09k    74.02%
  Latency Distribution
     50%    7.58ms
     75%   11.66ms
     90%   14.72ms
     99%   19.08ms
  765359 requests in 30.09s, 64.23MB read
Requests/sec:  25436.42
Transfer/sec:      2.13MB

更多比较请参阅BENCHMARK.md

中间件

Direkuta支持实现Middle trait的中间件。Direkuta附带一个示例Logger中间件,可用于。

每个中间件有两个状态,一个是在响应创建之前,另一个是在响应创建之后。

助手

Direkuta附带两个功能(默认启用),HTML模板支持使用Tera,以及JSON支持使用SerdeSerde JSON

Tera可以通过State访问,并使用templates/**/*文件夹进行模板。

extern crate direkuta;

use direkuta::prelude::*;sp
use direkuta::prelude::html::*;

fn main() {
    Direkuta::new()
        .route(|r| {
            r.get("/", |_, s, _| {
                Response::new().with_body(s
                    .get::<Tera>()
                    .render(Context::new(), "index.html")
                    .unwrap()).build()
            });
        }).run("0.0.0.0:3000");
}

另一方面,JSON响应封装在一个wrapper中。

示例(来自/examples

extern crate direkuta;
#[macro_use]
extern crate serde_derive;

use direkuta::prelude::*;

#[derive(Serialize)]
struct Example {
    hello: String,
}

fn main() {
    Direkuta::new()
        .route(|r| {
            r.get("/", |_, _, _| {
                Response::new()
                    .with_json(|j| {
                        j.body(Example {
                            hello: String::from("world"),
                        });
                    }).build()
            });
        }).run("0.0.0.0:3000");
}

JSON响应

{
  "code": 200,
  "messages": [],
  "result": {
    "hello": "world"
  },
  "status": "OK"
}

路由

direkuta 具有一个基于 ID/正则表达式的路由系统,格式如下:/<name:(.*)>/。请求的捕获可以稍后通过 c.get("name") 来访问。

例如这样(来自 /examples

extern crate direkuta;

use direkuta::prelude::*;

fn main() {
    Direkuta::new()
        .route(|r| {
            r.get("/<name:(.+)>", |_, _, c| {
                Response::new().with_body(c.get("name")).build()
            });
        }).run("0.0.0.0:3000");
}

路由系统还具有路径,允许您将其他路径分组在 URL 的一个部分下。

extern crate direkuta;

use direkuta::prelude::*;

fn main() {
    Direkuta::new()
        .route(|r| {
            r.path("/<name:(.+)>", |r| {
                r.get("/<age:(.+)>", |_, _, c| {
                    Response::new().with_body(format!("Name: {}, Age: {}", c.get("name"), c.get("age"))).build()
                });
            });
        }).run("0.0.0.0:3000");
}

路径路由器也可以用于在单个 URL 下有多个响应类型。

extern crate direkuta;

use direkuta::prelude::*;

fn main() {
    Direkuta::new()
        .route(|r| {
            r.path("/<name:(.+)>", |r| {
                r.get("", |_, _, c| {
                    Response::new().with_body(c.get("name")).build()
                });
                r.post("", |_, _, c| {
                    Response::new().with_body(c.get("name")).build()
                });
            });
        }).run("0.0.0.0:3000");
}

依赖项

~7–11MB
~190K SLoC