#deserialize #query #data-query #serde #http #http-request #get

deserialize_form_style_query_parameter

使用Serde反序列化表单样式查询参数

7个版本

0.2.2 2024年2月17日
0.2.1 2024年1月23日
0.1.3 2024年1月22日

1738解析器实现

Download history 7/week @ 2024-03-26 35/week @ 2024-04-02

每月下载量 80

MIT/Apache

16KB
111

一个微小的crate,用于从http GET请求的查询参数中反序列化表单样式数据。基于 Serde 构建。

能够反序列化

  1. 表单样式简单数组 (/users?id=3,4,5),其元素类型T实现了 FromStr 特性。
  2. 任何类型(例如,表单对象/users?id=role,admin,firstName,Alex),以某种方式实现了 FromStr 特性(稍微复杂)。

注意:如果您只想使用 FromStr 进行反序列化,您可能只需要 serde_with

示例代码

反序列化Vec

use deserialize_form_style_query_parameter::{form_vec_deserialize, option_form_vec_deserialize};
use serde::{Deserialize, Serialize};

#[derive(Debug, PartialEq, Deserialize, Serialize)]
struct QueryParams {
    id: Option<u32>,
    #[serde(deserialize_with = "form_vec_deserialize")]
    user_ids: Vec<u8>,
    #[serde(deserialize_with = "option_form_vec_deserialize", default)]
    user_names: Option<Vec<String>>,
}

fn main() {
    let correct_answer = QueryParams {
        id: Some(12345),
        user_ids: vec![1, 3],
        user_names: None,
    };
    // serde_urlencoded::from_str is executed by axum::extract::Query.
    // https://docs.rs/axum/latest/src/axum/extract/query.rs.html#87
    // So handler(Query(para)) also works.
    let example_params: QueryParams =
        serde_urlencoded::from_str("id=12345&user_ids=1,2b,3")
            .unwrap();
    assert_eq!(example_params, correct_answer);
}

反序列化对象

use deserialize_form_style_query_parameter::pure_from_str;
use serde::{Deserialize, Serialize};
use std::str::FromStr;

#[derive(Debug, PartialEq, Deserialize, Serialize)]
struct Address {
    city: String,
    postcode: String,
}

impl FromStr for Address {
    type Err = ();

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        // This function might be very complex in actual situations.
        let parts: Vec<&str> = s.split(',').collect();
        if parts.len() != 4{
            return Err(());
        }
        if !parts[0].eq("city") || !parts[2].eq("postcode") {
            return Err(());
        }
        Ok(Address{
            city: parts[1].to_string(),
            postcode: parts[3].to_string()
        })
    }
}

#[derive(Debug, PartialEq, Deserialize, Serialize)]
struct QueryParams {
    id: Option<u32>,
    #[serde(deserialize_with = "pure_from_str")]
    address: Address,
}

fn main() {
    let correct_answer = QueryParams {
        id: Some(12345),
        address: Address {
            city: "Teyvat".to_string(),
            postcode: "191919".to_string()
        }
    };
    let example_params: QueryParams =
        serde_urlencoded::from_str("id=12345&address=city,Teyvat,postcode,191919")
            .unwrap();
    assert_eq!(example_params, correct_answer);
}

有关更多详细信息和使用方法,请参阅文档。

依赖关系

~0.4–1MB
~24K SLoC