44 个版本
0.7.0-alpha.1 | 2019年12月13日 |
---|---|
0.6.6 | 2019年7月17日 |
0.6.4 | 2019年2月27日 |
0.5.9 | 2018年3月12日 |
0.3.2 | 2017年7月31日 |
#2235 in 网页编程
每月 131 次下载
93KB
2K SLoC
真诚
真诚是一个基于 hyper 和多线程的 Rust (稳定) 微型网页框架,风格类似 koa。它旨在成为更小、更易表达、更健壮的网页应用和 API 的基础。真诚在核心中不捆绑任何中间件,并提供了一套优雅的方法,使编写服务器变得快速且愉快。以下是一个简单应用的示例
extern crate sincere;
use sincere::App;
fn main() {
let mut app = App::new();
app.get("/", |context| {
context.response.from_text("Hello world!").unwrap();
});
app.run("127.0.0.1:8000").unwrap();
}
不要忘记将此添加到你的 Cargo.toml
[dependencies]
sincere = "0.7.0-alpha.1"
构建并运行,然后,访问 http://127.0.0.1:8000/
,你将在屏幕上看到 Hello world
。
API 文档
指南
路由
app.add("GET", "/user", ...);
app.get("/user", ...);
app.get("/user/{id:[0-9]+}", ...);
app.post("/user", ...);
app.put("/user/{id:[0-9]+}", ...);
app.delete("/user/{id:[0-9]+}", ...);
app.options("/", ...);
app.connect("/", ...);
app.head("/", ...);
路由分组
use sincere::App;
use sincere::Group;
fn main() {
let mut app = App::new();
app.get("/", |context| {
context.response.from_text("Hello world!").unwrap();
});
let mut user_group = Group::new("/user");
// /user
user_group.get("/", ...);
// /user/123
app.get("/{id:[0-9]+}", ...);
app.mount_group(user_group::handle);
app.run("127.0.0.1:8000");
}
use sincere::App;
use sincere::Group;
use sincere::Context;
pub struct User;
impl User {
pub fn list(mut context: &mut Context) {
...
}
pub fn detail(mut context: &mut Context) {
...
}
pub fn handle() -> Group {
let mut group = Group::new("/user");
group.get("/", Self::list);
group.get("/{id:[0-9]+}", Self::detail);
group
}
}
fn main() {
let mut app = App::new();
app.get("/", |context| {
context.response.from_text("Hello world!").unwrap();
});
app.mount(User::handle());
app.run("127.0.0.1:8000");
}
中间件
use sincere::App;
fn main() {
let mut app = App::new();
app.begin(|context| {
...
});
app.before(|context| {
...
});
app.after(|context| {
...
});
app.finish(|context| {
...
});
app.get("/", |context| {
context.response.from_text("Hello world!").unwrap();
});
app.run("127.0.0.1:8000");
}
...
app.begin(...).begin(...);
app.begin(...).finish(...);
app.begin(...).before(...).after(...).finish(...);
...
app.get("/", |context| {
context.response.from_text("Hello world!").unwrap();
}).before(...).after(...);
let mut group = Group::new("/user");
group.before(...).after(...);
group.get("/", |context| {
context.response.from_text("Hello world!").unwrap();
}).before(...).after(...);
pub fn auth(context: &mut Context) {
if let Some(token) = context.request.get_header("Token") {
match token::verify_token(token) {
Ok(id) => {
context.contexts.insert("id".to_owned(), Value::String(id));
},
Err(err) => {
context.response.from_text("").unwrap();
context.stop();
}
}
} else {
context.response.status_code(401);
context.stop();
}
}
app.post("/article", ...).before(auth);
group.post("/", ...).before(auth);
pub fn cors(app: &mut App) {
app.begin(move |context| {
if context.request.method() == &Method::Options {
context.response
.status_code(204)
.header(("Access-Control-Allow-Methods", "GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS"));
context.stop();
}
});
app.finish(move |context| {
context.response
.header(("Access-Control-Allow-Origin", "*"))
.header(("Access-Control-Allow-Headers", "content-type, token"));
});
}
app.use_middleware(cors);
路径参数
app.get("/user/{id}", |context| {
let id = context.request.param("id").unwrap();
});
app.get("/user/{id:[0-9]+}", |context| {
let id = context.request.param("id").unwrap();
});
app.get("/user/{id:[a-z0-9]{24}}", |context| {
let id = context.request.param("id").unwrap();
});
查询参数
/article?per_page=10&page=1
app.get("/article", |content| {
let page = context.request.query("page").unwrap_or("1");
let per_page = context.request.query("per_page").unwrap_or("10");
});
绑定 Json
serde_derive = "1.0"
[dependencies.serde_json]
version = "1.0"
features = ["preserve_order"]
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
app.post("/article", |content| {
#[derive(Deserialize, Debug)]
struct New {
title: String,
image: Vec<String>,
content: String
}
let new_json = context.request.bind_json::<New>().unwrap();
// some code
let return_json = json!({
"article_id": 123
});
context.response.from_json(return_json).unwrap();
});
获取和设置头部,HTTP 状态码
app.get("/", |context| {
let token = context.request.header("Token").unwrap_or("none".to_owned());
context.response.from_text("Hello world!").status_code(200).header(("Hello", "World")).unwrap();
});
依赖
~17MB
~324K SLoC