Как я могу разобрать строки запроса в actix-web?

Как я могу разобрать аргументы name и color из следующего URL-адреса с помощью actix-web?

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

Я полагаю, что мой путь должен быть /path/to/page, а затем, когда я пытаюсь запросить name, я получаю пустую строку (req.match_info().query("name") где req: &HttpRequest).

Единственная найденная мной документация касается сопоставления имен (например, , если путь /people/{page}/, он будет соответствовать /people/123/, так что page = 123, но это не то, что я хочу.


person H. Desane    schedule 28.01.2019    source источник


Ответы (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"

Вы также можете использовать экстрактор для десериализации параметров запроса в структуру с помощью 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"

Если вам нужны необязательные параметры, просто укажите свойства в своей структуре Options.

username: Option<String>

Вы также можете использовать несколько web::Query<SomeType> параметров в обработчике.

person Rokit    schedule 23.09.2019
comment
Это должен быть принятый ответ. - person Amoo Hesam; 13.04.2021

Это для actix-web v0.7

Мне удалось заставить его работать, используя:

let name = req.query().get("name").unwrap(); // name = "ferret"
person H. Desane    schedule 28.01.2019
comment
Изменилось ли это в последней версии? В Actix Web 1.0.7 я получаю error[E0599]: no method named query`, найденный для типа actix_web::request::HttpRequest в текущей области` - person C14L; 30.08.2019

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

В официальной документации есть еще один пример.

person pinsl    schedule 14.07.2021