我是一个新手,正在尝试做一个简单的电子邮件解析器,但我面临着新手在Rust中借用东西的常见问题。
我尝试编译下面的代码,它希望将带有reqwest
的json响应解析到我的结构MessagesListResponse
中,然后我只想返回一个只包含Mapid的字符串的Vec:
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct MessagesListResponse{
messages: Vec<MessageId>
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct MessageId{
id: String,
thread_id: String
}
#[async_trait]
impl MessageGetter for GmailMessageGetter{
async fn get_message_ids(&self) -> Vec<String> {
let url = "https://gmail.googleapis.com/gmail/v1/users/me/messages?q=from%3Awebank%40webank.it%20subject%3Aautorizzato%20pagamento".to_owned();
dbg!(&url);
let response = &self.client.get(url).send().await.unwrap();
_ = &response.error_for_status_ref().unwrap();
let msg_list_response = response.json::<MessagesListResponse>().await.unwrap();
msg_list_response.messages.into_iter().map(|message_id| message_id.id).collect()
}
}
不幸的是,我一直得到错误
cannot move out of `*response` which is behind a shared reference
在线
let msg_list_response = response.json::<MessagesListResponse>().await.unwrap();
但是我不明白如何使它工作,因为响应类型reqwest::async_impl::response
是不可克隆的,而response.json
方法消耗了响应。有人能帮帮我吗多谢了。
1条答案
按热度按时间gzjq41n41#
这里有一个不必要的参考。
删除它,你的代码就可以工作了。
这里的赋值和引用是不必要的,没有任何作用。
你可以删除它们。
URL末尾的
.to_owned()
也是不必要的。你应该把它拿掉。这些是唯一的问题,但另一种编写方法是作为一个大的方法链。