2个版本
0.1.1 | 2024年8月3日 |
---|---|
0.1.0 | 2024年7月21日 |
0.0.2 |
|
0.0.1 |
|
0.0.0 |
|
#102 在 HTTP服务器
每月292次下载
635KB
18K SLoC
Argan
Rust的Web框架。
特性
- 静态、正则表达式和通配符URI组件模式。
- 资源和处理器扩展。
- 请求数据提取器和自定义守卫支持。
- 支持范围请求、
multipart/byteranges
、预编码文件和动态编码的静态文件流。 - 服务器端事件。
- WebSocket。
- 与Tower兼容的灵活中间件系统。
- 灵活的错误处理。
使用示例
Cargo.toml
[dependencies]
argan = "0.1"
hyper-util = { version = "0.1", features = ["server-auto", "tokio"] }
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
main.rs
use std::time::Duration;
use argan::{
data::{form::Form, json::Json},
middleware::RedirectionLayer,
prelude::*,
};
use hyper_util::{rt::TokioExecutor, server::conn::auto::Builder};
use serde::{Deserialize, Serialize};
// --------------------------------------------------------------------------------
#[derive(Deserialize)]
struct Credentials {
// ...
}
#[derive(Serialize)]
struct Token {
jwt: String,
}
async fn login(Form(credential): Form<Credentials>) -> Json<Token> {
// ...
let token = Token {
jwt: "JWT".to_owned(),
};
Json(token)
}
async fn echo(request_head: RequestHead) -> String {
request_head.subtree_path_segments().to_owned()
}
// --------------------------------------------------
#[tokio::main]
async fn main() -> Result<(), BoxedError> {
let mut router = Router::new();
let mut root = Resource::new("http://www.example.com/");
root.set_handler_for(Method::GET.to(|| async { "Hello, World!" }));
// Subresources can be created from a parent node (`Resource`, `Router`).
root
.subresource_mut("/login")
.set_handler_for(Method::POST.to(login));
router.add_resource(root);
router
.resource_mut("http://example.com/")
.wrap(
RequestReceiver.component_in(RedirectionLayer::for_permanent_redirection_to_prefix(
"http://www.example.com/",
)),
);
// A hostless resource responds to requests targeting any other host that
// the router doesn't include.
//
// With the question mark '?' following its pattern, the resource accepts
// a request with or without a trailing slash '/'. With asterisk '*', it
// accepts requests that target non-existent subresources.
router
.resource_mut("/echo ?*")
.set_handler_for(Method::GET.to(echo));
let arc_service = router.into_arc_service();
let connection_builder = Builder::new(TokioExecutor::new());
Server::new(connection_builder)
.with_graceful_shutdown_duration(Duration::from_secs(3))
.serve(arc_service, "127.0.0.1:8000")
.await
.map_err(Into::into)
}
注意
目前,Argan尚未在Windows上进行测试。
贡献
您有意提交的任何贡献,只要包含在Argan中,都必须像Argan一样双重许可,在MIT许可证和Apache许可证版本2.0下,没有附加条款或条件。
许可证
Argan可以在您的选择下双重许可,要么是MIT许可证,要么是Apache许可证版本2.0。
依赖项
~5–18MB
~301K SLoC