rust - 如何在 actix-web 中接收多个具有相同名称的查询参数?

标签 rust query-string actix-web

actix-web documentation is only an example如何接收唯一命名的查询参数。

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

http://localhost:8088/test?id=1&id=2&id=3

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

use actix_web::web;
use serde::Deserialize;

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

#[get("/test")]
async fn index(info: web::Query<Info>) -> impl Responder  {
    println!("Id: {}!", info.id);
    
    "ok"
}

最佳答案

看看this question ,似乎您想要的东西没有明确的标准。不知道actix有没有这样的提取器。我会处理我的 Deserialize impl。

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

关于rust - 如何在 actix-web 中接收多个具有相同名称的查询参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63844460/

相关文章:

rust - 为什么不能在同一结构中存储值和对该值的引用?

http - 在没有等号的情况下传递查询字符串参数(其值为空)是否有效?

.net - 带有 url 编码和符号的查询字符串在 Request.Url 中过早解码

rust - 在actix-web中用作查询参数时,如何将无效的枚举变量转换为“无”

heroku - 在 Heroku 中使用支持 HTTP2 的 actix-web

rust - 使用 Emscripten 目标从 Rust 创建 web worker

rust - 如何对ncurses crate 进行monkeypatch(模拟)调用?

macros - 如何创建一个 Rust 宏来定义一个字符串变量,它的值是它自己的标识符?

angularjs - 在AngularJS中删除查询字符串

rust - 为什么我共享的 actix-web 状态有时会重置回原始值?