在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);

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

正常运行:

相关推荐
IT_陈寒5 小时前
为什么你应该学习JavaScript?
前端·人工智能·后端
淇奥75 小时前
【MyBatis-Plus】MyBatis-Plus 学习笔记
后端
_code_bear_5 小时前
OpenSpec CLI 与 OPSX 工作流说明
前端·后端·架构
用户8356290780515 小时前
使用 Python 在 PowerPoint 中添加并控制音频播放
后端·python
用户8356290780516 小时前
使用 Python 在 PowerPoint 中生成并自定义饼图与环形图
后端·python
念何架构之路6 小时前
Go语言常见并发模式
开发语言·后端·golang
Cosolar6 小时前
大模型应用开发面试 • 第4期|A2A、复杂挑战与具身智能
人工智能·后端·面试
迷渡6 小时前
聊一聊 Bun 用 Rust 重写这件事
开发语言·后端·rust
王中阳Go7 小时前
秒杀、分库分表、全链路追踪:一个电商微服务的架构全拆解
后端·go
正儿八经的少年7 小时前
Spring Boot 两种激活配置方式的作用与区别
java·spring boot·后端