8个版本
0.1.8 | 2018年10月16日 |
---|---|
0.1.7-beta | 2018年9月24日 |
0.1.5-beta | 2018年8月21日 |
#1258 in HTTP服务器
每月24次下载
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支持使用Serde和Serde 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