1 个不稳定版本
使用旧Rust 2015
0.1.0 | 2018年8月17日 |
---|
#1132 在 HTTP服务器
36KB
858 行
lucifer
Lucifer是一个Web服务器库。Lucifer附带了自己的http实现。此外,它还提供了路由和添加中间件的可能性。
入门指南
首先,您需要将lucifer添加到您想要使用的项目的依赖项中。现在将lucifer添加到您的文件中。extern crate lucifer;
要添加到路由中的函数需要有以下签名
fn [function_name](req: Request, args: Args)
启动服务器时,它需要一个RouteHandler和一个MiddleWareStore。我们先不考虑MiddleWareStore。RouteHandler是一个对象,您可以向其中添加服务器要监听的路由。可以通过以下方式添加并监听根路由。
extern crate lucifer;
use lucifer::http::*;
use lucifer::router::*;
use lucifer::middleware::*;
fn main() {
let mut server = lucifer::Server::new();
let mut router = RouteHanlder::new();
router.add(Method::GET, "/", root_function);
server.listen("127.0.0.1:8000", router, MiddlewareStore::new())
}
路由
路由处理器
路由由RouteHandler处理。可以通过add_route
方法添加路由,并通过get_route
方法检索对应的函数。
添加和检索路由时,可以使用所有HTTP动词,这些动词在枚举http::Method
中定义。这些动词包括
- get
- head
- post
- put
- delete
- trace
- options
- connect
- patch
路由本身可以是静态路由,也可以包含变量,这些变量在函数被调用时是可访问的。要在路由中添加变量部分,请从':'开始,后面跟变量名。不要在URL中使用相同的名称多次,否则将发生名称冲突,其中一个将无法在函数中访问。此值可以在函数中从args中检索。在args中,变量名仍然约束':'以使变量的来源清晰。
除了单个变量之外,路由的其余部分也可以是变量。这可以通过使用'*'作为路由来实现,例如/static/*
。这将调用每个以/static/
开头的请求相同的函数,并且可以通过args.get("*")
从args中检索uri的其余部分。
静态路由的示例
在这个例子中,/static/
路由将服务请求的文件或返回404错误。
extern crate lucifer;
use lucifer::http::*;
use lucifer::router::*;
use lucifer::middleware::*;
use std::fs::File;
use std::io::prelude::*;
fn main() {
let mut server = lucifer::Server::new();
let mut routes = RouteHandler::new();
routes.add_route(Method::GET, "/static/*", static_content);
server.listen("127.0.0.1:8000", routes, MiddlewareStore::new());
}
fn static_content(_req: Request, args: Args) -> Response {
let mut res = Response::new();
match args.get("*") {
Some(resource) => {
let mut location = String::from("./static/");
location.push_str(resource);
match File::open(location) {
Ok(mut file) => {
let mut contents = String::new();
match file.read_to_string(&mut contents) {
Ok(_) => {res.send_message(&contents);},
Err(_) => {res.set_status(500);}
}
},
Err(_) => {
res.set_status(404);
}
}
},
None => {
res.set_status(404);
}
}
res
}
请注意,上述代码不安全,如果没有对输入进行敏感化处理,可能会被滥用,从而读取系统上的意外文件。
查询
该路由器支持类似 /path/to/page?name=ferret&colour=purple
的uri查询。该功能可以从形式为 '?' 后跟查询变量名的 args 中获取这些信息。对于此示例 uri,它给出了变量键 ?name
,其值为 ferret
,以及键 ?colour
,其值为 purple
。
片段
最后,该路由器还会将给定的片段添加到 args 中。片段以键 #
的形式添加。
中间件
要在应用程序中使用中间件,必须将中间件添加到 middlware::MiddlewareStore
的一个实例中,您将其作为第三个参数传递给 Server.listen()
。
创建中间件
要为 lucifer 创建中间件,中间件需要实现 middleware::Middleware
、Sync
和 Send
特性。Middleware 特性要求实现以下签名的方法调用。
fn call(&self, req: Request, args: Args, handle: &mut MiddlewareHandle) -> Response
中间件可以访问将传递到请求路由上函数的相同参数。中间件调用与路由函数之间的区别是额外的 MiddlewareHandle 参数。此句柄有一个名为 next 的函数,必须调用它以继续执行剩余的中间件和特定于路由的函数。一个空中间件,除了传递请求外什么都不做,如下所示。
extern crate lucifer;
use lucifer::middleware::*;
pub struct Nothing {}
impl lucifer::middleware::Middleware for Nothing {
fn call(&self, req: Request, args: Args, handle: &mut MiddlewareHandle) -> Response {
handle.next(req, args)
}
}
要修改传入的参数,可以修改或替换 Request 和 Args。另一方面,对于想要修改传出响应的人来说,可以捕获 MiddlewareHandle.next() 的结果,并修改或替换它。第三种选择是永不调用 handle.next(),而是创建并返回中间件的响应。