4个版本
0.2.1 | 2023年10月7日 |
---|---|
0.2.0 | 2023年10月6日 |
0.1.2 | 2023年9月22日 |
0.1.1 | 2023年9月22日 |
0.1.0 |
|
480 在 HTTP服务器 中排名
每月下载量 37 次
39KB
882 行
乐美特是一个简单、快速、为完成项目而构建的同步框架。
特性
- 闪电般的性能 (~600k req/sec 在ryzen 7 5700x上使用
wrk
) - 内置的线程系统,允许您高效地处理请求。
- 完全没有异步元素,提高了用户体验。
- 最小化构建大小,剥离后为500kb。
- 使用您可能已经熟悉的模型库
http
- 魔法函数处理程序!请参阅 入门指南
- 独特的路由系统
入门指南
乐美特使用一组处理程序系统和路由模块来处理请求和响应。
以下是一个简单的Hello World服务器示例。
use vegemite::{run, sys, Get, Route, Response};
fn get(_get: Get) -> Response<String> {
let content = String::from("<h1>Hello World</h1>");
Response::builder()
.status(200)
.body(content)
.unwrap()
}
fn main() {
let router = Route::new(sys![get]);
run("127.0.0.1:8080", router);
}
让我们将其分解为其组成部分。
路由
路由器将按其部分逐步遍历页面,首先从路由开始。它将尝试运行它遍历的每个节点的所有系统。一旦收到响应,它将停止遍历请求。
假设我们有一个路由器 Route::new(sys![auth]).route("page", Route::new(sys![get_page]))
和请求 /page
在这个例子中,我们将首先调用 auth
,如果认证返回响应,比如用户未经授权,我们希望提前响应,然后我们在这里停止。否则,我们继续到下一个节点 get_page
如果没有返回响应,服务器将自动返回 404
。这将在未来可配置。
参数/守卫
函数参数在 vegemite
中既可以作为获取器也可以作为守卫使用。
在上面的示例中,Get
充当守卫,以确保系统仅在GET
请求上运行。
任何实现特质的类型Resolve<Output = ResolveGuard<Self>>
都可以作为参数使用。
vegemite
将尝试提供您最常用的守卫和获取器,但目前实现的并不多。
示例
pub struct Get;
impl Resolve for Get {
fn resolve(ctx: &mut Context) -> ResolveGuard<Self> {
if ctx.request.method() == Method::GET {
ResolveGuard::Value(Get)
} else {
ResolveGuard::None
}
}
}
返回类型
系统需要返回一个实现MaybeIntoResponse
的值。
此外,请注意IntoResponse
的存在,它为始终返回响应的任何类型自动实现MaybeIntoResponse
。
如果类型从None
返回,则不会发送响应,并且路由将继续到后续节点。
示例
impl IntoResponse for u16 {
fn response(self) -> RawResponse {
Response::builder()
.version(Version::HTTP_10)
.status(self)
.header("Content-Type", "text/plain; charset=UTF-8")
.header("Content-Length", "0")
.body(Vec::new())
.expect("Failed to build request")
}
}
贡献
如果您有关于功能或改进的建议,请随时提交问题或拉取请求!
许可
MIT许可(LICENSE或https://opensource.org/licenses/MIT)
依赖
~580KB