在rust中使用reqwest获取响应里面的cookie,报错borrow of moved value: `response`value borrowed here after move

注意:要使用cookie,需要先开启reqwest的cookie特性

ini 复制代码
reqwest = { version = "0.12", features = ["json", "cookies"] }

为啥会报租借错误呢?说的是先move了,然后再borrowed,因为move会转移response的所有权,转移所有权之后,就不能在原实例上租借了,这是rust中的规范。那再看一下为啥这里会报租借呢?看一下response.cookies()里面的定义:

可以看到cookies上面绑定了一个生命周期`a,这个生命周期是和Response绑定的,所以当Response销毁的时候,这个cookie对应的也会销毁。

那是不是在这个cookie之前有某个地方使用并move了这个response实例?

确实是的,我在获取响应内容的时候使用了这个response实例和.text()方法,看一下这个方法里面的内容是啥?

rust 复制代码
// body methods

    /// Get the full response text.
    ///
    /// This method decodes the response body with BOM sniffing
    /// and with malformed sequences replaced with the REPLACEMENT CHARACTER.
    /// Encoding is determined from the `charset` parameter of `Content-Type` header,
    /// and defaults to `utf-8` if not presented.
    ///
    /// Note that the BOM is stripped from the returned String.
    ///
    /// # Note
    ///
    /// If the `charset` feature is disabled the method will only attempt to decode the
    /// response as UTF-8, regardless of the given `Content-Type`
    ///
    /// # Example
    ///
    /// ```
    /// # async fn run() -> Result<(), Box<dyn std::error::Error>> {
    /// let content = reqwest::get("http://httpbin.org/range/26")
    ///     .await?
    ///     .text()
    ///     .await?;
    ///
    /// println!("text: {content:?}");
    /// # Ok(())
    /// # }
    /// ```
    pub async fn text(self) -> crate::Result<String> {
        #[cfg(feature = "charset")]
        {
            self.text_with_charset("utf-8").await
        }

        #[cfg(not(feature = "charset"))]
        {
            let full = self.bytes().await?;
            let text = String::from_utf8_lossy(&full);
            Ok(text.into_owned())
        }
    }

就是在这里response发生了租借,所以后面我们不能再次使用response了,那么应该怎么做呢?

就是应该先使用cookies(),然后再使用text(),这样就没有问题了,完整使用代码:

rust 复制代码
        let response = request.send().await?;
        // 先使用cookie,再使用text
        let cookies = response.cookies();
        for c in cookies {
            println!("cookies: {:?} value:{:?}", c.name(), c.value());
        }
        // 获取cookie里面的ttwid
        let body = response.text().await?;
        println!("获取的直播间HTML内容是:{}", body);

也没有报错了,可以正常运行了:

正常运行:

相关推荐
Мартин.9 分钟前
[Meachines] [Easy] Help HelpDeskZ-SQLI+NODE.JS-GraphQL未授权访问+Kernel<4.4.0权限提升
后端·node.js·graphql
网络风云33 分钟前
golang中的包管理-下--详解
开发语言·后端·golang
京东零售技术1 小时前
一次线上生产库的全流程切换完整方案
后端
我们的五年2 小时前
【C语言学习】:C语言补充:转义字符,<<,>>操作符,IDE
c语言·开发语言·后端·学习
Like_wen2 小时前
【Go面试】工作经验篇 (持续整合)
java·后端·面试·golang·gin·复习
Channing Lewis4 小时前
flask常见问答题
后端·python·flask
Channing Lewis4 小时前
如何保护 Flask API 的安全性?
后端·python·flask
Ai 编码助手12 小时前
在 Go 语言中如何高效地处理集合
开发语言·后端·golang
小丁爱养花12 小时前
Spring MVC:HTTP 请求的参数传递2.0
java·后端·spring
Channing Lewis12 小时前
什么是 Flask 的蓝图(Blueprint)
后端·python·flask