14次发布

0.2.3 2020年6月3日
0.2.2 2020年5月25日
0.1.9 2020年5月13日

#1007HTTP服务器

每月40次下载

MIT 协议

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.jsonres.send 会自动设置状态码为 200。要覆盖它,请在 res.sendres.json 后调用 res.status(status: u32)

嵌套路由

嵌套路由也是可能的。 Router 对象作为构建块,可以通过在父 Router 上调用 .mount 与子 Router 组合在一起。服务器扩展(Rust 不支持继承,但 RouterServer 实现了相同的 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