3个不稳定版本
0.3.0 | 2024年1月26日 |
---|---|
0.2.1 | 2023年2月3日 |
0.2.0 | 2023年2月3日 |
#1370 在 HTTP服务器
26 每月下载量
在 swim 中使用
34KB
536 行
Swim ⚡🏊
一种关于Rust Web框架的意见和内置方法。
想法是取Rust生态系统的最佳部分,结合成一个易于使用且提供良好开发者体验的框架。
安装
将以下内容添加到您的 Cargo.toml
文件中。
[dependencies]
swim = "0.2"
功能
- 使用 hyper 和 tokio 焰速运行
- 使用 routerify 强大的路由功能
- 使用 cargo-swim 的CLI工具(即将推出)
- 使用 SeaORM 支持数据库(计划中)
- 使用 Tera 模板(计划中)
- 依赖注入(计划中)
构建项目
您通过定义一个实现 Project
特性的结构体来定义一个项目。这是框架中最高级别的抽象。它负责定义项目的设置、应用程序和中间件。
use swim::prelude::*;
struct MyProject;
impl Project for MyProject {
fn settings(&self) -> Settings {
Settings::builder()
.extend_ron(relative!("settings.ron"))
.build()
.unwrap()
}
fn apps(&self) -> Vec<Box<dyn App>> {
vec! [
MyApp.into()
]
}
fn middleware(&self) -> Vec<Box<dyn Middleware>> {
vec! [
MyMiddleware.into()
]
}
}
构建应用程序
您通过定义一个实现 App
特性的结构体来定义一个应用程序。它负责定义应用程序的路由和视图。
use swim::prelude::*;
struct MyApp;
impl App for MyApp {
fn mount(&self) -> &'static str {
"/"
}
fn config(&self) -> AppConfig {
AppConfig::with_name("MyApp")
}
fn models(&self) -> Vec<Box<dyn Model>> {
vec! []
}
fn routes(&self) -> Vec<Route> {
vec! [
Route::new("/", IndexView),
Route::new("/hello", HelloView),
Route::new("/greeting/:name", GreetingView),
]
}
}
构建视图
您通过定义一个实现 View
特性的结构体来定义一个视图。它负责处理请求并返回响应。您可以实现您想要处理的特定HTTP方法。
#[derive(Debug)]
pub struct HelloView;
#[async_trait::async_trait]
impl View for HelloView {
async fn get(&self, request: Request<Body>) -> Result<Response<Body>> {
Ok(Response::builder()
.status(StatusCode::OK)
.body(Body::from("Say hello to Swim! "))
.unwrap())
}
async fn post(&self, request: Request<Body>) -> Result<Response<Body>> {
Ok(Response::builder()
.status(StatusCode::OK)
.body(Body::from("It's a post request! "))
.unwrap())
}
}
定义中间件
您通过定义一个实现 Middleware
特性的结构体来定义一个中间件。您可以挂钩到 pre
和 post
方法,这些方法可以修改即将到来的请求并分别留下响应(或者您也可以简单地使用这些方法来监控流量)。
#[derive(Debug)]
pub struct Logger;
#[async_trait::async_trait]
impl Middleware for Logger {
async fn pre(&self, request: Request<Body>) -> Result<Request<Body>> {
println! ("New request: {:?}", request.uri());
Ok(request)
}
async fn post(&self, response: Response<Body>) -> Result<Response<Body>> {
println! ("Response: {:?}", response.status());
Ok(response)
}
}
运行项目
您可以使用优雅的swim宏来运行您的项目。
#[tokio::main(flavor = "multi_thread")]
async fn main() {
swim! (MyProject, host = "localhost", port = 8000);
}
当前状态
设备已构建,但尚未包含电池。
贡献
如果您有任何想法或建议,请随时提出问题或PR。这个项目完全是关于新想法和改善开发者体验。
依赖
~12–23MB
~313K SLoC