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

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

正常运行:

相关推荐
Undoom39 分钟前
【腾讯位置服务开发者征文大赛】基于YOLOv8与腾讯地图的视障辅助Android应用——从模型训练到端侧部署全链路实践
后端
ltl1 小时前
【大模型基础设施工程】03:CUDA 生态——cuBLAS、cuDNN、NCCL、Triton、CUTLASS
后端
wan_jm1 小时前
Go Web 开发提速 3(gos):Filter 实战与变量注入 —— 通用逻辑复用与依赖解耦
后端
rannn_1111 小时前
【Redis|原理篇2】Redis网络模型、通信协议、内存回收
java·网络·redis·后端·缓存
RDCJM2 小时前
Springboot的jak安装与配置教程
java·spring boot·后端
_Evan_Yao2 小时前
对话的边界:HTTP 的克制,SSE 的流淌,WebSocket 的自由
java·后端·websocket·网络协议·http
危桥带雨3 小时前
FLASH代码部分
java·后端·spring
Rust研习社3 小时前
添加依赖库时的 features 是什么?优雅实现编译期条件编译与模块化开发
开发语言·后端·rust
马艳泽4 小时前
接到新需求后快速产出可执行的方案和时间估算
后端
Rust研习社4 小时前
Rust 条件变量(Condvar)详解:线程同步的高效方式
后端·rust·编程语言