0

我正在使用warp在 Rust 中创建服务器。假设我设置了这两条路线。

let route_one = warp::get().and(warp::path("path1")).map(|| warp::reply());
let route_two = warp::get().and(warp::path("path2")).map(|| warp::reply());

warp::serve(route_one.or(route_two))
    .run(([127, 0, 0, 1], 3000))
    .await;

我想将路线移动到自己的功能中。返回类型是什么?

例如:

async fn get_route_one() {
     warp::get().and(warp::path("path1")).map(|| warp::reply())
}

async fn get_route_two() {
     warp::get().and(warp::path("path1")).map(|| warp::reply())
}

#[tokio::main]
async fn main() {
    warp::serve(get_route_one().or(get_route_two()))
        .run(([127, 0, 0, 1], 3000))
        .await;
}

我已经尝试过使用warp:Filter它的多种变体,但我还没有找到可以编译的返回类型。

PS 我知道在这个例子中将过滤器提取到它们自己的函数中只会使事情复杂化,但我有一种情况,它实际上可能会简化事情。

4

2 回答 2

1

这将取决于您的实际类型,但在impl Filter<Extract = impl warp::Reply, Error = warp::Rejection>. 我建议查看todos 示例以获取灵感。

于 2021-07-17T06:24:49.033 回答
1

这就是我们在自己的项目中所做的。例如,我们可能有这样的端点:

pub async fn index(cfg: crate::settings::Settings) -> Result<impl warp::Reply, warp::Rejection> {
    info!("Index endpoint called");
    Ok(warp::reply::with_status(
        format!("Welcome to Our API Version {}", cfg.version),
        http::StatusCode::OK,
    ))
}

我们可能有另一个像这样的端点:

pub async fn health() -> Result<impl warp::Reply, warp::Rejection> {
    Ok(warp::reply::with_status("OK", http::StatusCode::OK))
}

我们可以构建一个像这样包装这些的函数:

use warp::Filter;

/// External endpoints: /v1/base
pub fn base_endpoints(
    config: crate::settings::Settings,
) -> impl Filter<Extract = impl warp::Reply, Error = warp::Rejection> + Clone {

    let base_endpoints_trunk = warp::path("v1").and(warp::path("base"));
    let index = base_endpoints_trunk
        .and(warp::get())
        .and(warp::path::end())
        .and(crate::settings::with_cfg(config.clone()))
        .and_then(index);
    let health = base_endpoints_trunk
        .and(warp::get())
        .and(warp::path("health"))
        .and(warp::path::end())
        .and_then(health);

    index.or(health)
}

然后,在我们的内部main,我们可以做这样的事情:

let base = endpoints::base_endpoints(CONFIG.clone());

warp::serve(base.recover(errors::handle_rejection)).run(([0, 0, 0, 0], 9000)).await
于 2021-12-18T20:01:10.313 回答