如何在actix-web中解析查询字符串?

时间:2019-01-28 16:09:43

标签: rust rust-actix

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

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

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

我发现的唯一documentation是关于匹配名称的(例如,如果路径为/people/{page}/,它将与/people/123/匹配,使得page = 123但这不是我想要的

3 个答案:

答案 0 :(得分:3)

我设法通过使用使其工作:

let name = req.query().get("name").unwrap(); // name = "ferret"

答案 1 :(得分:3)

好像他们删除了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"

您还可以使用extractor使用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"

如果需要可选参数,只需在结构Option中设置属性即可。

username: Option<String>

您还可以具有多个web::Query<SomeType>参数,因此可以组合可选参数和必需参数。非常灵活。

答案 2 :(得分:1)

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))
}

The official documentation 有另一个例子。