#query-string #serde #query-parser #deserialize #serialization

serde-querystring

基于serde的查询字符串反序列化器

15次发布

0.3.0-beta.02024年8月8日
0.2.1 2023年3月6日
0.2.0 2023年2月1日
0.1.0 2022年12月28日
0.0.7 2020年11月22日

#184 in 编码

Download history 217/week @ 2024-05-01 392/week @ 2024-05-08 427/week @ 2024-05-15 403/week @ 2024-05-22 483/week @ 2024-05-29 380/week @ 2024-06-05 366/week @ 2024-06-12 274/week @ 2024-06-19 403/week @ 2024-06-26 344/week @ 2024-07-03 667/week @ 2024-07-10 896/week @ 2024-07-17 714/week @ 2024-07-24 476/week @ 2024-07-31 864/week @ 2024-08-07 562/week @ 2024-08-14

2,789 每月下载量
用于 6 个crate (5 直接)

MIT/Apache

90KB
2K SLoC

Serde-querystring



支持不同解析方法的Rust查询字符串解析器。

安装

# Cargo.toml
[dependencies]
serde-querystring = "0.3.0-beta.0"

用法

您可以直接使用此crate提供的解析器,每个解析器的测试中都有示例。

use serde_querystring::DuplicateQS;

let parsed = DuplicateQS::parse(b"foo=bar&foo=baz");
let values = parsed.values(b"foo"); // Will give you a vector of b"bar" and b"baz"

或者您可以使用serde(具有 serde 功能,默认启用)

use serde::Deserialize;
use serde_querystring::{from_str, ParseMode, DuplicateQS};

#[derive(Deserialize)]
struct MyStruct{
  foo: Vec<String> // Or (String, u32) tuple
}

let parsed: MyStruct = from_str("foo=bar&foo=2022", ParseMode::Duplicate).unwrap();
// or
let parsed: MyStruct = DuplicateQS::parse(b"foo=bar&foo=baz").deserialize().unwrap();

还有针对 actix_web(serde-querystring-actix) 和 axum(serde-querystring-axum) 的crate,它们为其框架提供提取器,可以不直接依赖核心crate来使用。

解析器

简单模式

简单地解析键=值对,每个键只接受一个值。如果一个键被重复,我们只收集最后一个值。

use serde_querystring::{UrlEncodedQS, ParseMode, from_str};

UrlEncodedQS::parse(b"key=value");
// or
let res: MyStruct = from_str("foo=bar&key=value", ParseMode::UrlEncoded).unwrap();

重复键模式

通过重复键支持向量或值。

use serde_querystring::{DuplicateQS, ParseMode, from_str};

DuplicateQS::parse(b"foo=bar&foo=bar2&foo=bar3");
// or
let res: MyStruct = from_str("foo=bar&foo=bar2&foo=bar3", ParseMode::Duplicate).unwrap();

分隔符模式

通过使用分隔符字节(例如b'|')支持向量或值。

use serde_querystring::{DelimiterQS, ParseMode, from_str};

DelimiterQS::parse(b"foo=bar|bar2|bar3", b'|');
// or
let res: MyStruct = from_str("foo=bar|bar2|bar3", ParseMode::Delimiter(b'|')).unwrap();

括号模式

通过使用括号和子键支持向量或值。

use serde_querystring::{BracketsQS, ParseMode, from_str};

BracketsQS::parse(b"foo[1]=bar&foo[2]=bar&foo[3]=bar");
// or
let res: MyStruct = from_str("foo[1]=bar&foo[2]=bar&foo[3]=bar", ParseMode::Brackets).unwrap();

致谢

我们使用了一些来自 form_urlencoded 的代码行来解析百分编码字符。

许可

此项目受以下任一许可协议的许可:

任选其一。

依赖

~125–350KB