rust warp框架教程1-helloworld

2023-07-11 13:52:00 浏览数 (1)

warp框架简介

warp is a super-easy, composable, web server framework for warp speeds.

warp建立在hyper之上,因此,warp天生支持异步,HTTP/2,以及“正确的HTTP实现”。

warp的强大之处在于其提供的filter系统,它帮助我们实现了非常灵活的对HTTP的处理。我们可以来先看一下文档中给出的例子:

代码语言:javascript复制
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 中的各种参数。

安装warp框架

在 rust 中安装 warp 是非常简单的,使用 cargo 即可。这里介绍安装 warp 框架是为了介绍目前 rust 开发 web 相关的库。我将 cargo.toml 中所有的依赖放在下面。

代码语言:javascript复制
[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"
  • log 和 pretty_env_logger 是我们在 wrap 中使用的 log 库。pretty_env_logger 可以在控制台输出比较漂亮的日志记录,pretty_env_loggor 的作者也是 warp 的作者;
  • tokio 是 rust 社区中比较常用的异步运行时,我们使用的 warp 和 sqlx 都需要依赖于 tokio; sqlx 的 features 需要看 sqlx 的文档,它在 0.7 版本可能会发生比较大的变化。目前的依赖表明 sqlx 的异步运行时是 tokio, 驱动是 postgres, 支持 macros 宏,支持 chrono 时间类型;
  • serde 是序列化框架,serde_json 是基于 serde 实现的 json 序列化和反序列化框架。

hello-world 示例

安装完成依赖之后,我们可以来跑一下 hello-world 程序。

代码语言:javascript复制
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 路径:

代码语言:javascript复制
curl http://127.0.0.1:3030/hello/warp

访问之后,应该可以看到 Hello, warp! 这样的消息返回。

  • warp::serve(hello) 将路由加入到 server 中,而 run 中指定了 127.0.0.1 以及 3030 端口,注意这是异步的,因此最后要使用await.

可能会存在的疑问

有人可能会问,这里的 hello 是什么类型,这是个好问题,后面我们在说。现在,你只需要知道,你不能被这个类型吓住,望而止步即可。

部署相关

warp 框架本身就是 hyper 这样的 HTTP 服务器,因此在部署的时候是不需要额外的动态服务器,它本身就提供了 HTTP 服务器。因此,通常只需要使用一个静态服务器做反向代理即可。

0 人点赞