encoding - Rust如何对带有字节参数的字符串进行urlencode?
问题描述
我有一些像这样的参数:
{'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}
我想把它全部 urlencoded 成这样的字符串:
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)
解决方案
这有点小技巧,但是您可以通过闭包覆盖值的编码方式,因此,您将能够以这种方式潜入二进制值。在下面的示例中,我使用"!"
来指示替换二进制值的位置,但是您实际上可以使用任何东西:
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"
推荐阅读
- r - 巨型 csv -> R 中的大量 csv
- javascript - MapBox 网络应用地图小部件,多个“绘制”参数。添加不透明度和半径失败
- javascript - 在三元操作中使用 React JSX 和 HTML 无法正确显示
- python - 来自数据框的嵌套饼图
- laravel - Laravel 包绑定的奇怪行为 - 模型存在并设置绑定时的 ModelNotFoundException
- c - 错误:pthread rw_lock 中“{”标记之前的预期表达式
- java - 如何使用 Dockerfile 构建 Spring Boot 应用程序 (Maven)?
- c++ - 如何在 Visual Studio 2019 的文本编辑器中启用搜索栏?
- java - 从二维数组中删除特定行
- maven - spring-swagger-wordnik-client项目的分发管理中缺少站点信息