19

如何使用actix-web从以下 URL解析name和参数?color

http://example.com/path/to/page?name=ferret&color=purple

我想我的路径应该是/path/to/page,然后当我尝试查询时,name我收到一个空字符串(req.match_info().query("name")where req: &HttpRequest)。

我找到的唯一文档是关于匹配名称的(例如,如果路径是/people/{page}/匹配的/people/123/page = 123但这不是我想要的。

4

3 回答 3

19

看起来他们删除了该query功能并且只有一个query_string功能。您可以为此使用一个名为qstring的板条箱:

use qstring::QString;
...
let query_str = req.query_string(); // "name=ferret"
let qs = QString::from(query_str);
let name = qs.get("name").unwrap(); // "ferret"

您还可以使用提取器将查询参数反序列化为带有 Serde 的结构

use serde::Deserialize;

#[derive(Deserialize)]
struct Info {
    username: String,
}

fn index(info: web::Query<Info>) -> Result<String, actix_web::Error> {
    Ok(format!("Welcome {}!", info.username))
}

username请注意,只有在请求中实际存在查询时才会调用处理程序。这将调用处理程序:

curl "http://localhost:5000?username=joe"

但这些不会:

curl "http://localhost:5000"
curl "http://localhost:5000?password=blah"

如果您需要可选参数,只需在 struct 中创建属性Option

username: Option<String>

您还可以web::Query<SomeType>在处理程序中使用多个参数。

于 2019-09-23T03:30:01.543 回答
4

这是针对 actix-web v0.7

我设法通过使用:

let name = req.query().get("name").unwrap(); // name = "ferret"
于 2019-01-28T16:22:41.623 回答
3

actix_web::web::query解析查询字符串:

use actix_web::{web, App};
use serde_derive::Deserialize;

#[derive(Debug, Deserialize)]
pub struct Params {
    name: String,
    color: String,
}

#[get("/path/to/page")]
async fn handler(req: HttpRequest) -> HttpResponse {
    let params = web::Query::<Params>::from_query(req.query_string()).unwrap();
    HttpResponse::Ok().body(format!("{:?}", params))
}

官方文档还有一个例子。

于 2021-07-14T12:06:48.313 回答