我的hyper
服务器设置或多或少与此处的第三个示例完全相同:https ://docs.rs/hyper/0.14.16/hyper/server/index.html 。我的handle
函数版本调用了其他一些async
函数,一切正常,直到我尝试将一些 URL 查询参数编码为其中一个异步函数中的字符串。Serializer
当我在调用的函数之一中包含涉及 的四行时,我的项目停止编译handle
:
async fn broken_func(&self, param: &str) -> Result<String, Infallible> {
// ...
let mut s = url::form_urlencoded::Serializer::new(String::new());
// the presence or absence of these two lines has no effect on the bug, but
// they demonstrate how I'm trying to use the Serializer
s.append_pair("key", "value");
println!("{:?}", s.finish());
drop(s); // <-- thought this might help, but it doesn't
// ...
Ok(query_string)
}
我得到的错误是
generator cannot be sent between threads safely
the trait `std::marker::Sync` is not implemented for `dyn for<'r> std::ops::Fn(&'r str) -> std::borrow::Cow<'_, [u8]>`
我不知道这有什么关系form_urlencoded::Serializer
。但是,我知道Serializer
两者都是!Send
and !Sync
,但在这种情况下,我只在一个函数中使用它,所以我认为这不会有什么不同吗?如果我删除上面的那四行,它会回到编译。
因此,为了将一些键/值对序列化为 URL 查询参数,我必须使用以下内容,这看起来很荒谬——不仅因为这对于如此简单的事情来说是不必要的复杂,而且还因为在后台url::Url::parse_with_params
使用form_urlencoded::Serializer
。
let query_string = url::Url::parse_with_params(
"http://example.com",
&[("key", "value")]
)
.unwrap()
.query()
.map(|s| s.to_owned())
.unwrap();
知道为什么尝试在函数Serializer
内部显式使用async
会导致事情中断吗?