注意:要使用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);
也没有报错了,可以正常运行了:
正常运行: