如何使用actix-web从以下URL解析name
和color
参数?
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
但这不是我想要的
答案 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 有另一个例子。