个人技术分享

Warp是一个用 Rust 编写的流行的异步 web 框架。在使用 warp 构建 RESTful API 时,可以通过多种方式传递参数到你的处理函数中。

以下是一些常见的方法,说明如何在 warp 中传递参数:

  1. 路径参数
    你可以使用 warp::pathwarp::path::param 来从 URL 路径中提取参数。
use warp::Filter;

#[tokio::main]
async fn main() {
    let hello = warp::path!("hello" / String)
        .map(|name: String| format!("Hello, {}!", name));

    warp::serve(hello)
        .run(([127, 0, 0, 1], 3030))
        .await;
}

在这个例子中,hello 路径段后的字符串将被捕获并作为参数传递给处理函数。

  1. 查询参数
    对于查询参数,你可以使用 warp::query 过滤器来解析。
use warp::Filter;
use serde::Deserialize;

#[derive(Deserialize)]
struct QueryParams {
    q: String,
}

#[tokio::main]
async fn main() {
    let query_params = warp::query::<QueryParams>()
        .map(|params: QueryParams| format!("You searched for: {}", params.q));

    warp::serve(query_params)
        .run(([127, 0, 0, 1], 3030))
        .await;
}

在这个例子中,查询参数 q 被解析到 QueryParams 结构体中,并在处理函数中使用。

  1. 请求体
    对于来自请求体的数据(通常是 POST 或 PUT 请求中的数据),你可以使用 warp::body::json 或其他类似的过滤器来解析。
use warp::Filter;
use serde::Deserialize;

#[derive(Deserialize)]
struct User {
    name: String,
    age: u32,
}

#[tokio::main]
async fn main() {
    let create_user = warp::post()
        .and(warp::body::json::<User>())
        .map(|user: User| format!("Created user: {}, age: {}", user.name, user.age));

    warp::serve(create_user)
        .run(([127, 0, 0, 1], 3030))
        .await;
}

在这个例子中,请求体中的 JSON 数据被解析到 User 结构体中,然后可以在处理函数中使用。

  1. HTTP 头
    你可以使用 warp::header 来获取特定的 HTTP 头。
use warp::Filter;
use std::str::FromStr;

#[tokio::main]
async fn main() {
    let token_header = warp::header::<String>("authorization")
        .map(|token: String| format!("Your token is: {}", token));

    warp::serve(token_header)
        .run(([127, 0, 0, 1], 3030))
        .await;
}

在这个例子中,authorization 头的内容被捕获并可以在处理函数中使用。

请注意,这些只是传递参数到 warp 处理函数的一些基本方法。warp 是一个功能强大的框架,支持更复杂的路由和参数处理逻辑。你可以通过组合不同的过滤器来构建复杂的 API 路由和处理逻辑。