16 releases

0.3.0 Feb 9, 2025
0.3.0-beta.0 Aug 8, 2024
0.2.1 Mar 6, 2023
0.2.0 Feb 1, 2023
0.0.7 Nov 22, 2020

#163 in Encoding

Download history 716/week @ 2024-11-20 593/week @ 2024-11-27 679/week @ 2024-12-04 708/week @ 2024-12-11 590/week @ 2024-12-18 377/week @ 2024-12-25 431/week @ 2025-01-01 775/week @ 2025-01-08 1113/week @ 2025-01-15 1444/week @ 2025-01-22 1187/week @ 2025-01-29 1609/week @ 2025-02-05 1062/week @ 2025-02-12 1014/week @ 2025-02-19 1630/week @ 2025-02-26 940/week @ 2025-03-05

4,836 downloads per month
Used in 15 crates (7 directly)

MIT/Apache

86KB
2K SLoC

Serde-querystring



A query string parser for rust with support for different parsing methods.

Install

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

Usage

You can use the parsers provided in this crate directly, examples are available in each parser's tests.

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"

Or you can use serde(with serde feature, enabled by default)

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();

There are also crates for actix_web(serde-querystring-actix) and axum(serde-querystring-axum) which provide extractors for their frameworks and can be used without directly relying on the core crate.

Parsers

Simple Mode

Simply parses key=value pairs, accepting only one value per key. In case a key is repeated, we only collect the last value.

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();

Repeated key mode

Supports vectors or values by repeating a key.

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();

Delimiter mode

Supports vectors or values by using a delimiter byte(ex. 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();

Brackets mode

Supports vectors or values by using a brackets and subkeys.

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();

Credit

We use some lines of code from form_urlencoded to parse percent encoded chars.

License

This project is licensed under either of

at your option.

Dependencies

~0–435KB