Rust как urlencode строки с байтовыми параметрами? - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть несколько параметров, таких как:

{'peer_id': '-PC0001-781232119400', 'port': 6889, 'event': 'started', 'compact': 1, 'left': 2097152000, 'uploaded': 0, 'info_hash': b'\xd5@\xfcH\xeb\x12\xf2\x831c\xee\xd6B\x1dD\x9d\xd8\xf1\xce\x1f', 'downloaded': 0}

Я бы хотел, чтобы все они были закодированы в строку, например, так:

my_url?peer_id=-PC0001-781232119400&port=6889&event=started&compact=1&left=1&uploaded=0&info_hash=%D5%40%FCH%EB%12%F2%831c%EE%D6B%1DD%9D%D8%F1%CE%1F&downloaded=0"

Я играл с urlcodeи придумать это:

extern crate url;
use url::form_urlencoded;

fn main() {

    let encoded: String = form_urlencoded::Serializer::new(String::new())
        .append_pair("foo", "bar & baz")
        .append_pair("saison", "Été+hiver")
        .finish();

    println!("{:?}", encoded);
}

Проблема в том, что apprend_pair принимает пару &'str - она ​​не принимает байтов ... Я не уверен, как достичь своей цели.

В python я бы просто использовал встроенный from urllib.parse import urlencode и сделал бы urlencode(params)

1 Ответ

1 голос
/ 20 сентября 2019

Это что-то вроде хака, но вы можете переопределить то, как значения кодируются через замыкание, и, таким образом, вы сможете использовать двоичные значения таким образом.Я использую "!", чтобы указать, где подставить двоичные значения в моем примере ниже, но вы действительно можете использовать что-нибудь:

fn main() {
    let binary = vec![0, 1, 2, 3];

    let encoded = form_urlencoded::Serializer::new(String::new())
        .append_pair("foo", "bar & baz")
        .append_pair("saison", "Été+hiver")
        .encoding_override(Some(&|input| {
            if input != "!" {
                // Return the actual value ("info_hash", in this particular case)
                Cow::Borrowed(input.as_bytes())
            } else {
                // When "!" is seen, return the binary data instead
                Cow::Owned(binary.clone())
            }
        }))
        .append_pair("info_hash", "!")
        .finish();

    println!("{:?}", encoded);
}

Это выводит

"foo =bar +% 26 + baz & saison =% C3% 89t% C3% A9% 2Bhiver & info_hash =% 00% 01% 02% 03 "

Вы можете попробовать это здесь: https://play.rust -lang.org /? версия = стабильные и режим = отлаживать и издание = 2018 & суть = 805d80ebbc98909fa32177030102ba12

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...