14次发布
0.2.3 | 2020年6月3日 |
---|---|
0.2.2 | 2020年5月25日 |
0.1.9 | 2020年5月13日 |
#1007 在 HTTP服务器
每月40次下载
27KB
581 行
受express.js启发的极简REST服务器
快速入门
extern crate burner;
use burner::{Server, Request, Response, RouterService}; // Import into scope
// Create the server
let mut server = Server::new();
// Create a route controller clojure
let controller = |req: &Request, res: &mut Response| {
// Set the HTTP status code to be 200 OK, default is 404
res.status(200);
};
// Register controller on server to be triggered by a request to path / and method: GET
let path = "/";
server.get(path, Box::new(controller));
// Start the server on port
let PORT = 6789;
server.listen(PORT);
路由参数
您还可以在路径中使用路由参数来实现动态路径。要在路径中指定路由参数,请使用冒号加变量名,例如,/users/:userid
。该参数将在请求对象中可用:req.route_params.get("userid")
头部变量
头部变量也存在于请求对象中。令牌和其他元数据通常存储在这里。该参数将在请求对象中可用:req.headers.get("HEADER_KEY")
请求体
可以通过request.body
访问请求体,例如:let user_name: &str = req.body['name']
返回数据
res.json(json: &Value)
用于处理 json 数据,使用 serde_json::Value
或者 res.send(msg: &str)
发送字符串消息。 res.json
和 res.send
会自动设置状态码为 200
。要覆盖它,请在 res.send
或 res.json
后调用 res.status(status: u32)
。
嵌套路由
嵌套路由也是可能的。 Router
对象作为构建块,可以通过在父 Router 上调用 .mount
与子 Router 组合在一起。服务器扩展(Rust 不支持继承,但 Router
和 Server
实现了相同的 trait,这在其他语言中类似于接口)。因此,Router 上的每个方法也都在 Server 上可用。服务器始终作为根路由器,所有请求首先都会指向它。一个利用嵌套 Router 的示例应用程序。
extern crate burner;
use burner::{Server, Request, Response, Router, RouterService}; // Import into scope
// Initialize server and routers
let mut server = Server::new();
let mut user_router = Router::new();
let mut post_router = Router::new();
let get_user = |req: &Request, res: &mut Response| {
println!("Get user controller");
let user_id = req.route_params.get("userid").unwrap();
let response = format!("Hello user {}", user_id);
res.send(&response);
};
let create_user = |req: &Request, res: &mut Response| {
res.send("Create user controller");
};
user_router
.get("/:userid", Box::new(get_user)) // Will be accessible at path: /users/:userId
.post("/", Box::new(create_user)); // Will be accessible at path: /users
let get_post = |req: &Request, res: &mut Response| {
res.send("Get post controller");
};
let create_post = |req: &Request, res: &mut Response| {
res.send("Create post controller");
};
post_router
.get("/:postid", Box::new(get_post)) // Will be accessible at path: /posts/:postId
.post("/", Box::new(create_post)); // Will be accessible at path: /posts
let user_router_path_prefix = "/users";
let post_router_path_prefix = "/posts";
// Mount routers into server (parent router)
server
.mount(user_router_path_prefix, user_router)
.mount(post_router_path_prefix, post_router);
// To create additional nesting just mount other routers on user_router or post_router or some other router
// Start server
let port = 6789;
server.listen(port);
即将推出的功能
- 中间件
依赖关系
~355–750KB
~17K SLoC