warp is a super-easy, composable, web server framework for warp speeds.
warp建立在hyper之上,因此,warp天生支持异步,HTTP/2,以及“正确的HTTP实现”。
warp的强大之处在于其提供的filter系统,它帮助我们实现了非常灵活的对HTTP的处理。我们可以来先看一下文档中给出的例子:
use warp::Filter;
let hi = warp::path("hello")
.and(warp::path::param())
.and(warp::header("user-agent"))
.map(|param: String, agent: String| {
format!("Hello {}, whose agent is {}", param, agent)
});
这个示例中,使用and组合了多个Filter。
warp::path("hello")
要求路径的前缀是 hello;warp::path::param()
提取路径参数;warp::header("user-agent")
提取请求头中的 user-agent;map
接受一个闭包,将前面提取的路径参数和请求头参数都提取为 String 类型,传入闭包,闭包将返回一个组装的字符串。从这个示例中,我们可以看到,warp带来的非常灵活的 Filter 系统,可以让我们很容易的处理 HTTP 中的各种参数。
在 rust 中安装 warp 是非常简单的,使用 cargo 即可。这里介绍安装 warp 框架是为了介绍目前 rust 开发 web 相关的库。我将 cargo.toml 中所有的依赖放在下面。
[package]
name = "web_warp"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
log = "0.4"
pretty_env_logger = "0.4"
tokio = { version = "1", features = ["full"] }
warp = "0.3"
sqlx = { version = "0.6", features = [ "runtime-tokio-rustls", "postgres", "macros", "chrono" ] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
安装完成依赖之后,我们可以来跑一下 hello-world 程序。
use warp::Filter;
#[tokio::main]
async fn main() {
// GET /hello/warp => 200 OK with body "Hello, warp!"
let hello = warp::path!("hello" / String)
.map(|name| format!("Hello, {}!", name));
warp::serve(hello)
.run(([127, 0, 0, 1], 3030))
.await;
}
我们可以在命令行使用 curl 命令来访问一下 /hello/warp 路径:
curl http://127.0.0.1:3030/hello/warp
访问之后,应该可以看到 Hello, warp! 这样的消息返回。
有人可能会问,这里的 hello 是什么类型,这是个好问题,后面我们在说。现在,你只需要知道,你不能被这个类型吓住,望而止步即可。
warp 框架本身就是 hyper 这样的 HTTP 服务器,因此在部署的时候是不需要额外的动态服务器,它本身就提供了 HTTP 服务器。因此,通常只需要使用一个静态服务器做反向代理即可。