如何在 actix-web 中接收多个同名查询参数?

zin*_*ngi 5 query-string rust actix-web

actix-web 文档中仅提供了如何接收唯一命名的查询参数的示例。

但是如何接收多个同名的查询参数呢?例如:

http://localhost:8088/test?id=1&id=2&id=3
Run Code Online (Sandbox Code Playgroud)

我必须如何更改以下代码才能接受多个 id 以及如何读取它们?

http://localhost:8088/test?id=1&id=2&id=3
Run Code Online (Sandbox Code Playgroud)

4_5*_*5_4 3

看看这个问题,似乎你想要什么没有明确的标准。不知道actix有没有这样的提取器。我会致力于我的Deserialize实现。

use std::fmt;
use serde::de::{ Deserialize, Deserializer, Visitor, MapAccess};

impl<'de> Deserialize<'de> for Info {
    fn deserialize<D>(deserializer: D) -> Result<Info, D::Error>
    where
        D: Deserializer<'de>,
    {
        struct FieldVisitor;

        impl<'de> Visitor<'de> for FieldVisitor {
            type Value = Info;

            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
                formatter.write_str("`id`")
            }

            fn visit_map<V>(self, mut map: V) -> Result<Info, V::Error>
            where
                V: MapAccess<'de>
            {
                let mut ids:  Vec<String> = Vec::default();
                while let Some(key) = map.next_key()? {
                    match key {
                        "id" => {
                            ids.push(map.next_value::<String>()?)
                        }
                        _ => unreachable!()
                    }
                }
                Ok(Info {
                    id: ids
                })
            }
        }
        deserializer.deserialize_identifier(FieldVisitor)
    }
}

#[derive(Debug)]
struct Info {
    id: Vec<String>,
}
Run Code Online (Sandbox Code Playgroud)